7

我一直在努力理解 DDD。这是一个让我难以置信的场景。假设我们拥有具有价值对象分配/持有和历史价格的实体基金。如果服务只想要分配特定的基金怎么办?我们应该返回分配对象列表还是返回包含分配列表的 Fund 实体?如果我们采用第一种方法,我们需要创建一个分配存储库。第二种方法似乎有点奇怪,因为实体被修改为仅将某些值对象返回给服务。如果对实体没有太多了解,服务不应该让所有资金字段都可以访问吗?

我的描述可能不准确。如果我需要澄清我的帖子,请告诉我。

class Fund
{
   int fundId;
   List<Allocation> allocations;
   List<Holding> holdings;
}
class Allocation
{
   string type;
   string percentage;
}
4

3 回答 3

9

要回答标题中的问题,不,你不应该。仅当存储库中的项目具有身份时,存储库模式才有效。如果一个对象有身份,那么它就是一个实体而不是一个值对象。

值对象应该是全部或全部,例如更改值对象上的一个属性会替换整个事物。因此,值对象在创建后是不可变的。

这并不是说存储库内部的值对象版本不能具有身份,但您不应该让持久性问题改变您的域。

根据您的描述,它实际上听起来像是Allocation一个实体,因为它是可区分的,因此具有身份。

假设这Allocation是一个实体,那么我要问的问题应该Allocation是它自己的集合。

于 2013-08-07T14:56:22.763 回答
7

存储库实现有多种变体,但我不介意返回分配列表,并且仅当分配永远不会自行管理。

换句话说,如果您在某个时候想要获取有关分配的信息,无论它属于哪个基金,那么您将需要一个分配存储库,如果您正在创建这样一个存储库,那么您应该有类似getAllocationsbyFundId(int id)或类似的方法。如果在不知道它来自哪个基金的情况下单独查看分配没有意义,那么分配确实是基金的一部分,并且在您的基金存储库中有一个方法来返回分配的分配是完全有意义的特定基金。

但是,如果您最终GetAllAllocation()在 Fund 存储库中使用了一个方法,那么您已经脱离了一个干净的模式。

于 2013-08-07T15:27:25.423 回答
1

我可能不太了解您的域,所以如果我弄错了,请告诉我。当我们采用Order/OrderLine场景时,我们可以建模OrderLine为 VO(很像你的Fund/ Allocation)。为什么我们要查询一个服务来只返回一个OrderLine对象列表Order?:)

但是,如果您确实需要这样做,您应该加载Fund实例并使用其包含的Allocations列表。然而,查询你的领域模型通常会导致问题(延迟加载、获取策略以及远离告诉-不要-询问)。如果您确实需要查询,请考虑创建一个执行此功能的轻量级查询模型(有人称其为读取模型)。

因此,我同意 Mgetz 的观点,即您应该拥有一个 VO 存储库。如果您有固定的 VO 列表,那么您可以使用一种enum结构。在 C# 中,您可以使用readonly类实例来执行此操作。Vaughn Vernon 将此称为“标准类型”(如果没记错的话)。不过,我不认为你有这种情况。

于 2013-08-08T04:29:54.067 回答