2

对域驱动设计进行了一些阅读,似乎您应该通过从聚合根遍历来访问聚合中的所有实体。

但是,与此同时,您应该真正尝试封装您的数据,以便属性/字段受到保护或私有。

因此我的问题是:如果字段是受保护的/私有的,你应该如何遍历聚合?

我现在设置它的方式如下:我将域模型的所有属性标记为内部,并将“设置”方法标记为受保护。这样,至少模型之外的任何东西都不能访问属性,但是模型内的对象可以访问其他对象的属性,我仍然只允许从对象本身设置属性。

即使我已经这样做了,我仍然觉得这应该只适用于其他聚合实体的属性(我的意思是,客户的“名称”仍然是私有的,但他们的“订单”应该标记为内部以允许从客户 -> 订单 -> 等的遍历)

有人对此有任何指导吗?

编辑:

让我试着为这个问题举一个更具体的例子:我的对象图中有两个对象:Bookshelf 和 Book。为了这个例子,让我们说 Bookshelf 是聚合根,并且 Books 存储在书架上,因此只是聚合中的实体(Bookshelf 有书籍的集合)。

我想写一个方法来将一本新书添加到书架上。遵循 DDD 最佳实践,我相信我应该在 Bookshelf 类上编写一个方法,例如 AddBook(Book book)。

但是,如果有业务要求不能将同名书籍添加到书架上怎么办。我想要 Bookshelf.AddBook 方法中的一些逻辑来检查书籍的集合,以确保这本书不存在。

现在的问题是我不能这样做,因为我已经以一种很好的封装方式编写了 Book 对象,并且它的“Name”属性不可公开访问。

我知道这是一个相当人为的例子,但我希望它能更好地说明问题。我现在也意识到这不仅仅是 DDD 问题,而是现实中的 OO 封装问题。我敢肯定,必须有一种非常常见、简单的方法来解决我正在尝试做的事情,而且我在很大程度上想多了。

4

2 回答 2

2

There is nothing wrong in exposing properties in case of storng, composition-like relation between parent and its children. Child properties are exposed to the parent, but because their strong relationship and interdependenace it doean't break encapsulation.

In other words, there is nothing wrong in exposing Book's name property to the Bookshelf, but it would be wrong (in sense of DDD best practices) to expose Book's name to other aggregates. It would be also wrong to expose modifiable collection of books. Exposing read-only collection should be done with caution -- it can be sign of breaking of encapsulation.

Does this answer your question?

于 2010-07-02T22:21:23.673 回答
-1

访问者模式是典型的遍历机制。

于 2010-07-02T00:24:22.653 回答