Qual è la tua comprensione del modello di deposito?
-
05-07-2019 - |
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?
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.