3

我对如何处理不是数据库中数据表示的实体做了一个问题,而是一个我为商业目的需要的自定义实体。DDD和实体框架中的聚合

我的解决办法是在结构化:

  • 实体组件(POCO对象)
  • 库组件(EF代码优先)
  • 商业层组件
  • UI组件(MVC)

在我的实体程序集中,我有两个实体AB,并且对于特定的p urpose我的业务逻辑,我需要返回一个包含两个(其它性质)的对象:

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

我应该从资源库中直接返回该对象?或者业务层应该调用repo.GetArepo.GetB,然后创建X并返回它?

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

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

干杯。

+0

要遵循真正的DDD,我认为您的实体和存储库接口应该都在业务(域)层。 –

回答

4

我想你需要弄清楚X所属层和它到底是什么:

  • 域的实体,即它传达来自通用语言域的概念。在这种情况下,X可能是一个包含AB子实体列表的聚合根。除数据外,它还可能有方法。 X的存储库将保留A和B集合以及X对象,并且不存在AB的存储库。

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

+0

如果它是特定于UI的,会发生什么情况,但是将其从存储库中创建出来会非常昂贵?例如:一个加入/分组几个表的实体结果? – vtortola

+0

除了正常的软件仓库,您可以拥有专门的“分析”仓库。类似的问题在这里讨论:http://stackoverflow.com/questions/2098112/ddd-how-to-implement-high-performing-repositories-for-searching,http://stackoverflow.com/questions/2558469/ddd-骨料基层 – guillaume31

2

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