假设我有 2 个实体 - Foo 和 Bar。Foo 是聚合根并包含 Bar。据我了解,它应该看起来像这样:

public class Foo{
    private readonly Bar Bar;
}

我想为用户提供从定义的列表中选择 Bars for Foos 的功能(并更改它)。

如果存储库应该仅用于聚合根,则意味着将不存在 Bar 实体的存储库。

这会导致问题 - 如果不引用 Foo,则无法独立创建/更新 Bar。

这是否意味着 Bar 应该有一个存储库,尽管没有 Foo 就没有任何意义?

有帮助吗?

解决方案

如果你想从那里他们没有与富贵相关栏列表中进行选择,那么这是不是一个聚合根。例如,你不能得到的OrderItems的名单没有他们的订单,所以这是一个聚合根(订单),但你可以得到产品的名单分配到的OrderItems,所以产品是没有订单聚合根的一部分。

注意的是,虽然是OrderItem的订购聚合根的部分,仍然可以创建和独立地更新。但是,你不能没有参考订购得到它。同样为您的酒吧,即使是富的一部分,你可以得到每个(Foo.Bars),并使用它,或做Foo.AddBar(新的酒吧())。但是,如果你需要得到列表不富,酒吧是不是富集合的一部分。它是一个独立的实体。

好了,这就是我看到这里DDD,但我不是Eric Evans的,当然。

其他提示

具有聚合根的原因是:

  1. 它们提供对复合实体的受控和定向访问
  2. 他们可以强制执行规则以确保整个聚合有效

我的看法:如果您需要选择 Bar 没有a的物体 Foo, , 用一个 BarRepository.

但...如果你更新一个怎么办 Bar, ,并且它违反了其父级的验证规则 Foo?如果发生这种情况,您应该访问 Bar 通过它的父级 Foo.

但是,如果您需要访问一堆 Bar 对象(例如批处理作业或报告),并且您 知道Foos 不会被破坏,继续通过以下方式访问它们 BarRepository.

请记住,聚合根可以由其他聚合根组成。你可能会发现 Bar 本身就是一个聚合根,为您提供了理由 BarRepository :)

您确定酒吧需要一个实体?你有需要跟踪它,改变它的域名?如果你可以把它看作是一个值对象,我会建议你从服务获取它,然后将所选的值对象“连接”到富实体。对于通过一个下拉列表时刻。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top