Domanda

Sono in procinto di recuperare la documentazione tecnica per un progetto che ho completato alcuni mesi fa e che sto per finire. Ho usato i repository per astrarre il livello di accesso ai dati in entrambi e stavo scrivendo un breve riassunto del modello sul nostro wiki al lavoro.

È stato mentre stavo scrivendo questo riassunto che mi sono reso conto di aver adottato un approccio leggermente diverso la seconda volta.

Uno utilizzava un metodo InsertOnSubmit esplicito associato a un'unità di lavoro e un aggiornamento implicito con le modifiche al tracciamento UoW. L'altro aveva un metodo Salva che inseriva nuove voci e aggiornava esistente (senza UoW).

Quale approccio preferiresti in genere? Considera i soliti scenari CRUD, dove dovrebbe trovarsi la responsabilità di ciascuno di essi?

È stato utile?

Soluzione

Penso che un repository utilizzi Unit of Work, cache o altri concetti correlati debba essere lasciato all'implementazione. Preferisco che l'interfaccia assomigli a un archivio dati che è allineato con il modello di dominio a portata di mano. In modo che un repository dei clienti sia simile a questo:

interface ICustomerRepository
{
    Customer Load(int id);
    IEnumerable<Customer> Search(CustomerQuery q);
    void Save(Customer c);
    void Delete(Customer c);
}

Questo può essere facilmente implementato da qualcosa come NHibernate, o NHibernate con NHibernate.Linq, o una libreria SQL diretta, o anche un archivio XML o flat-file. Se possibile, mi piace mantenere il concetto di transazione al di fuori del repository o in un ambito più globale in modo che le operazioni di più repository possano far parte di un'unica transazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top