Преимущество создания общего хранилища по сравнению с конкретным хранилищем для каждого объекта?

Мы разрабатываем приложение 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.

Что мне не хватает?

Ответы на вопрос(5)

Ваш ответ на вопрос