单个或多个存储库类?

时间:2011-07-31 06:36:11

标签: entity-framework asp.net-mvc-2 domain-driven-design repository-pattern

我的数据库相对较小,有8个表,每个表少于5列。我用EF。我创建了单个存储库类,但现在我认为它可能不是使用它的正确方法。我应该为每个控制器设置单独的存储库类吗?假设我有产品,用户,Unicorns可以使用单个存储库类来操作所有这些并在每个控制器中实例化,或者我应该为每个控制器创建一个单独的存储库类吗?

3 个答案:

答案 0 :(得分:10)

DDD的一个关键概念是聚合根 - 这是您管理整套相关实体的“顶级”实体。

例如,在零售场景中,“订单”将是一个聚合根,您可以通过该聚合根访问订单本身,OrderItems列表(即产品+金额+修改者,如折扣),BillingAddress,ShippingAddress和PaymentMethod。其中每一个都与订单本身密切相关,以至于他们没有理由在订单范围之外存在。

每个聚合根应该有一个存储库,该存储库负责在根目录下持久化对象的整个子图。因此,在上面的示例中,您不希望或需要OrderItems的存储库,它允许独立访问订单项;相反,你应该实现一个OrdersRepository,它将Orders及其所有子组件作为一个单元处理。

根据您的特定域模型,您可能需要一个或多个存储库,但肯定不是每个实体类型一个。在寻找聚合根时要问的关键问题是“这个实体是否有自己的身份和生命周期?”订单这样做,OrderItems没有。

答案 1 :(得分:2)

考虑领域驱动设计,考虑到这一点,您将项目的逻辑结构划分为不仅仅作为类,而是作为域划分,这意味着所有操作都与Product位于一起在ProductsController内,因此在ProductsRepository内,所以我更喜欢许多存储库,每个存储库都配备了处理项目某些方面的操作。

并非所有方面都需要存储库,但这就是您的决定。

答案 2 :(得分:1)

我不认为每个实体的repoistory是一个好主意,而不是每个服务的存储库,如果这是有道理的。

例如,如果主要应用程序的重点是用户,我就不会去制作CategoriesRepository或CarsRepository。

相关问题