DDD和实体框架中的聚合

时间:2013-01-09 11:40:37

标签: design-patterns domain-driven-design repository-pattern

我有一个问题,关于如何处理不是数据库中数据表示的实体,而是为业务目的需要的定制实体。

我的解决方案结构如下:

  • 实体装配(POCO对象)
  • 存储库程序集(EF代码优先)
  • 业务层程序集
  • UI Assembly(MVC)

在我的实体程序集中,我有两个实体AB,为了我的业务逻辑的特定目的,我需要返回一个包含两个(以及其他属性)的对象: / p>

class X
{
   public A[];
   public B[];
}

我应该直接从存储库返回此对象吗?或者业务层是否应该调用repo.GetArepo.GetB,然后创建X并将其返回?

在这种情况下,也许在业务层中创建对象是有意义的。但是如果X类是AB的“分组依据”怎么办?然后从存储库返回它更有意义。

我想没有银弹,但有没有指导方针?

干杯。

2 个答案:

答案 0 :(得分:4)

我认为你需要找出X属于哪个层以及它到底是什么:

  • 域实体,即它从普遍存在的语言传达域概念。在这种情况下,X可能是一个聚合根,其中包含AB个子实体的列表。除数据外,它还可能有方法。 X的存储库会将A和B集合与X个对象一起保留,并且AB没有存储库。

  • 特定于UI或用例的数据结构。在这种情况下,域图层与X没有业务关系。应用程序或UI层将负责执行AB实例与X对象之间的映射。

答案 1 :(得分:2)

我的理解是存储库应始终处理业务类型对象。对于您而言,这相当于返回类型为X的对象的存储库。如何创建X是存储库的业务。这可以通过2个数据映射器获得A然后B并合并结果或其他适当的过程。