Nous sommes à élaborer un ASP.NET application MVC, et sont en train de construire le référentiel/classes de service. Je me demandais si il ya des grands avantages de la création d'un générique interface IRepository que tous les référentiels de mettre en œuvre, par rapport à chaque Référentiel d'avoir sa propre interface et un ensemble de méthodes.
Par exemple: un générique IRepository interface pourrait ressembler (prises à partir de cette réponse):
public interface IRepository : IDisposable
{
T[] GetAll<T>();
T[] GetAll<T>(Expression<Func<T, bool>> filter);
T GetSingle<T>(Expression<Func<T, bool>> filter);
T GetSingle<T>(Expression<Func<T, bool>> filter, List<Expression<Func<T, object>>> subSelectors);
void Delete<T>(T entity);
void Add<T>(T entity);
int SaveChanges();
DbTransaction BeginTransaction();
}
Chaque Référentiel de mise en œuvre de cette interface, par exemple:
- CustomerRepository:IRepository
- ProductRepository:IRepository
- etc.
L'alternative que nous avons suivie lors de précédents projets serait:
public interface IInvoiceRepository : IDisposable
{
EntityCollection<InvoiceEntity> GetAllInvoices(int accountId);
EntityCollection<InvoiceEntity> GetAllInvoices(DateTime theDate);
InvoiceEntity GetSingleInvoice(int id, bool doFetchRelated);
InvoiceEntity GetSingleInvoice(DateTime invoiceDate, int accountId); //unique
InvoiceEntity CreateInvoice();
InvoiceLineEntity CreateInvoiceLine();
void SaveChanges(InvoiceEntity); //handles inserts or updates
void DeleteInvoice(InvoiceEntity);
void DeleteInvoiceLine(InvoiceLineEntity);
}
Dans le second cas, les expressions LINQ (ou autre) serait entièrement contenu dans le Référentiel de mise en œuvre, celui qui met en œuvre le service a juste besoin de savoir ce qui référentiel de la fonction à appeler.
Je suppose que je ne vois pas l'avantage d'écrire tous la syntaxe de l'expression dans la classe de service et de passer à l'référentiel. Ne serait-il pas dire facile à messup LINQ code est dupliqué dans de nombreux cas?
Par exemple, dans notre ancien système de facturation, nous appelons
InvoiceRepository.GetSingleInvoice(DateTime invoiceDate, int accountId)
à partir d'un petit nombre de services différents (Client, Facture, Compte, etc). Cela semble beaucoup plus propre que l'écriture de la suite dans plusieurs endroits:
rep.GetSingle(x => x.AccountId = someId && x.InvoiceDate = someDate.Date);
Le seul inconvénient que je vois à l'aide de l'approche spécifique que nous pourrions nous retrouver avec un grand nombre de permutations de Se* fonctions, mais cela semble encore préférable de pousser l'expression de la logique dans les classes de Service.
Ce qui me manque?