12

我的数据库比较小,有8个表,每个表少于5列。我使用EF。我创建了单个存储库类,但现在我认为它可能不是正确的方式来使用它。我应该为每个控制器分别存储库类吗?比方说我有产品,用户,Unicorns是否可以让单个存储库类与所有这些控制器一起操作并在每个控制器中实例化,还是应该为每个控制器创建单独的存储库类?单个或多个存储库类?

回答

10

DDD的关键概念之一是聚合根 - 这是您通过其管理整套相关实体的“顶级”实体。例如,在一个零售场景中,'订单'将是一个可以访问订单本身的集合根,一个OrderItems列表(即产品+金额+修饰符,例如折扣),BillingAddress,ShippingAddress和PaymentMethod 。其中每一个都与订单本身密切相关,直到他们没有理由超出订单范围。

每个聚合根应该有一个存储库,它拥有在根目录下持久保存对象的整个子图的责任。所以在上面的例子中,你不需要或需要一个OrderItems的存储库,它允许独立地访问订购商品;相反,您应该实施一个OrdersRepository处理Orders及其所有子组件作为一个单元。

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

+0

很好的答案!有用的文章解释了这个概念http://devlicio.us/blogs/casey/archive/2009/02/16/ddd-aggregates-and-aggregate-roots.aspx – GibboK

1

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

例如,如果我的主要应用程序的焦点在用户上,我不会去制作CategoriesRepository或CarsRepository。

2

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

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