存储库模式和多个相关的核心实体或业务对象 - 一个存储库或更多?

时间:2010-02-24 15:59:45

标签: c# design-patterns repository-pattern

我正在考虑实现存储库模式(因为我提出的是90%的实现),并且遇到了一个设计问题 - 我有两个或更多核心业务对象(例如,业务并且在CRM应用程序中联系),BO可以是强烈相关的或者根本不相关。

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

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

潜在的DAL是EF4。

此致

2 个答案:

答案 0 :(得分:23)

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

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

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

我最近一直在做很多阅读,所以我希望我在思考过程中有所了解。

一些链接

Aggregate Root

Entities, Value Objects, Aggregates and Roots

答案 1 :(得分:6)

我完全同意马克的观点,但要多补充一点。在您了解创建通用存储库的好处时,常见的模式是IRepository和Repository。有一件事我发现更有用,杰里米·D·米勒(无法找到参考文献)揭示的是在方法层面上有泛型。

所以我的IReposity会有这样的方法:

T FindByKey<T>(int key);
IEnumerable<T> FindAll();
T FindBy<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression);
void Update<T>(entity);

然后,根据您的理念,您可以传递Repository类并直接查询它,或者将您的Repository实现抽象化并强制将其用于由显式存储库封装,如下所示:

CrmRepository : Repository
{
   FindByCustomerId(int customerId)
   { return FindByKey<Customer>(customerId);}
}