领域驱动设计和实体框架中的聚合根

3
我有一个问题,关于如何处理不是数据库中数据表示的实体,而是我为业务目的定制的实体。
我的解决方案结构如下:
  • 实体程序集(POCO对象)
  • 存储库程序集(EF Code First)
  • 业务层程序集
  • UI程序集(MVC)
在我的实体程序集中,我有两个实体A和B,为了特定的业务逻辑目的,我需要返回一个包含这两个实体(以及其他属性)的对象。
class X
{
   public A[];
   public B[];
}

我应该直接从存储库返回此对象吗?还是业务层应调用repo.GetArepo.GetB,然后创建X并将其返回?
在这种情况下,也许在业务层中创建对象更有意义。但如果X类是AB的"按组"结果,则从存储库返回它更有意义。
我想没有银弹,但是否有任何准则?
干杯。

为了遵循真正的领域驱动设计,我认为您的实体和仓储接口都应该在业务(领域)层中。 - Meta-Knight
2个回答

4

我认为你需要弄清楚X属于哪一层,并且它真正代表的是什么:

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

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


如果它是UI特定的,但从存储库中创建它非常昂贵会发生什么?例如:多个表的联接/分组的实体结果? - vtortola
你可以在普通代码库之外还有专门的“分析”代码库。类似的问题在这里讨论过: https://dev59.com/nXI95IYBdhLWcg3w5iY4, https://dev59.com/tUzSa4cB1Zd3GeqPquyi。 - guillaume31

2

我的理解是,仓库应该总是处理业务类型的对象。对于您来说,这相当于存储库返回X类型的对象。如何创建X是存储库的业务。这可以通过两个数据映射器获取A和B并合并结果或其他适当的过程来实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接