我们正在开发ASP.NET MVC应用程序,现在正在构建存储库/服务类。我想知道创建所有存储库都实现的通用IRepository接口是否有任何主要优势,而每个存储库都有自己的唯一接口和方法集。
例如:通用的IRepository接口可能看起来像(从此答案中获取):
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();
}
每个存储库都将实现此接口,例如:
- 客户资料库:IRepository
- 产品存储库:IRepository
- 等等
我们在先前项目中遵循的替代方法是:
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);
}
在第二种情况下,表达式(LINQ或其他形式)将完全包含在存储库实现中,无论谁实现该服务,只需知道要调用哪个存储库函数即可。
我想我看不到在服务类中编写所有表达式语法并将其传递到存储库的好处。这是否意味着在许多情况下重复易于使用的LINQ代码?
例如,在我们的旧发票系统中,我们称
InvoiceRepository.GetSingleInvoice(DateTime invoiceDate, int accountId)
来自一些不同的服务(客户,发票,帐户等)。这似乎比在多个位置编写以下内容要干净得多:
rep.GetSingle(x => x.AccountId = someId && x.InvoiceDate = someDate.Date);
我看到使用这种特定方法的唯一缺点是,我们可能最终会获得许多Get *函数的排列,但这似乎比将表达式逻辑推入Service类更好。
我想念什么?