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

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

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

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

底层DAL是EF4。

问候

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

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

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

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

一些链接

聚合根

实体,价值对象,聚合和根

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

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

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

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

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