Преимущество создания общего хранилища по сравнению с конкретным хранилищем для каждого объекта?
Мы разрабатываем приложение ASP.NET MVC и сейчас создаем классы хранилища / службы. Я'Интересно, есть ли какие-либо существенные преимущества в создании общего интерфейса IRepository, который реализуют все репозитории, по сравнению с каждым репозиторием, имеющим свой уникальный интерфейс и набор методов.
Например: общий интерфейс IRepository может выглядеть так (взят изэтот ответ):
public interface IRepository : IDisposable
{
T[] GetAll();
T[] GetAll(Expression filter);
T GetSingle(Expression filter);
T GetSingle(Expression filter, List subSelectors);
void Delete(T entity);
void Add(T entity);
int SaveChanges();
DbTransaction BeginTransaction();
}
Каждый репозиторий будет реализовывать этот интерфейс, например:
CustomerRepository: IRepositoryProductRepository: IRepositoryи т.п.Альтернатива, которую мыМы следовали в предыдущих проектах:
public interface IInvoiceRepository : IDisposable
{
EntityCollection GetAllInvoices(int accountId);
EntityCollection 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);
}
Во втором случае выражения (LINQ или иные) будут полностью содержаться в реализации репозитория, и тому, кто реализует службу, просто нужно знать, какую функцию репозитория вызывать.
Я думаю, я неНе вижу преимущества написания всего синтаксиса выражений в классе обслуживания и передачи в хранилище. Wouldn»не означает ли это, что во многих случаях дублируется код LINQ, который легко исправить?
Например, в нашей старой системе выставления счетов мы называем
InvoiceRepository.GetSingleInvoice(DateTime invoiceDate, int accountId)
из нескольких различных услуг (клиент, счет, счет и т. д.). Это кажется намного чище, чем писать следующее в нескольких местах:
rep.GetSingle(x => x.AccountId = someId && x.InvoiceDate = someDate.Date);
Единственный недостаток, который я вижу в использовании особого подхода, заключается в том, что мы можем получить множество перестановок функций Get *, но это все же кажется предпочтительным, чем проталкивание логики выражений в классы Service.
Что мне не хватает?