C# 存储库模式和多个相关的核心实体或业务对象—一个存储库还是多个?

C# 存储库模式和多个相关的核心实体或业务对象—一个存储库还是多个?,c#,design-patterns,repository-pattern,C#,Design Patterns,Repository Pattern,我正在考虑实现存储库模式(因为我提出的90%都是它的实现),并且遇到了一个设计问题——我有两个或两个以上的核心业务对象(例如,CRM应用程序中的业务和联系人),BO可以是密切相关的,也可以是完全不相关的 在这种情况下,我应该实现一个存储库(例如带有.addBusiness()、.addContact()等的CrmRepository)还是多个存储库(带有各自的.add()、.delete()等的BusinessRepository、ContactRepository) 在这种情况下,最佳做法是什

我正在考虑实现存储库模式(因为我提出的90%都是它的实现),并且遇到了一个设计问题——我有两个或两个以上的核心业务对象(例如,CRM应用程序中的业务和联系人),BO可以是密切相关的,也可以是完全不相关的

在这种情况下,我应该实现一个存储库(例如带有.addBusiness()、.addContact()等的CrmRepository)还是多个存储库(带有各自的.add()、.delete()等的BusinessRepository、ContactRepository)

在这种情况下,最佳做法是什么

潜在的DAL是EF4

问候


Moo

我们最近在我的工作中做了很多思考,并且看到了一些帮助我们以一致的方式可视化和设计存储库的文章

我们发现,更好的做法之一是为每个聚合根创建一个存储库。聚合根将是一种实体类型,您需要引用该实体类型才能访问子值类型。只能从数据库中查询实体类型,并且需要从实体中遍历任何子值类型

根据您的问题中的信息,业务似乎是聚合根,因此是实体类型,需要自己的存储库。因为联系人可以独立存在,所以也可以是聚合根。这两个对象可以相互引用,并使用存储库从联系人加载业务,或通过其各自的存储库从业务加载联系人

我最近读了很多书,所以我希望我在思考过程中能有所收获

一些链接


我完全同意马克的观点,但要补充一点。当您看到创建通用存储库的好处时,常见的模式是IRepository和Repository。Jeremy D.Miller(找不到参考资料)揭示了一件更有用的事情,那就是在方法级别使用泛型

因此,我的建议将有如下方法:

T FindByKey<T>(int key);
IEnumerable<T> FindAll();
T FindBy<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression);
void Update<T>(entity);
CrmRepository : Repository
{
   FindByCustomerId(int customerId)
   { return FindByKey<Customer>(customerId);}
}
T FindByKey(int键);
IEnumerable FindAll();
T FindBy(System.Linq.Expressions.Expression);
无效更新(实体);
然后,根据您的理念,您可以传递Repository类并直接查询它,或者将您的存储库实现抽象化,并强制使用显式存储库对其进行封装,如下所示:

T FindByKey<T>(int key);
IEnumerable<T> FindAll();
T FindBy<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression);
void Update<T>(entity);
CrmRepository : Repository
{
   FindByCustomerId(int customerId)
   { return FindByKey<Customer>(customerId);}
}
CrmRepository:存储库
{
FindByCustomerId(int customerId)
{返回FindByKey(customerId);}
}

+1-部分针对问题,部分针对CaH化身;)如果您正在继承从IRepository继承的存储库;相反,如何使用Repository和CrmRepository:Repository{/..}@Corey,您是否建议使用方法级泛型而不是类/存储库级泛型更好?我现在正在使用一个类级存储库,您能解释一下为什么只使用方法级可能更好吗?没关系。我刚刚意识到,您基本上不能只有方法级泛型,因为这将预期主键是某个类型。因此,基本上,对于具有多个类型(int或string等)作为PK的任何系统,存储库都会工作得更好。