对域驱动设计进行了一些阅读,似乎您应该通过从聚合根遍历来访问聚合中的所有实体。
但是,与此同时,您应该真正尝试封装您的数据,以便属性/字段受到保护或私有。
因此我的问题是:如果字段是受保护的/私有的,你应该如何遍历聚合?
我现在设置它的方式如下:我将域模型的所有属性标记为内部,并将“设置”方法标记为受保护。这样,至少模型之外的任何东西都不能访问属性,但是模型内的对象可以访问其他对象的属性,我仍然只允许从对象本身设置属性。
即使我已经这样做了,我仍然觉得这应该只适用于其他聚合实体的属性(我的意思是,客户的“名称”仍然是私有的,但他们的“订单”应该标记为内部以允许从客户 -> 订单 -> 等的遍历)
有人对此有任何指导吗?
编辑:
让我试着为这个问题举一个更具体的例子:我的对象图中有两个对象:Bookshelf 和 Book。为了这个例子,让我们说 Bookshelf 是聚合根,并且 Books 存储在书架上,因此只是聚合中的实体(Bookshelf 有书籍的集合)。
我想写一个方法来将一本新书添加到书架上。遵循 DDD 最佳实践,我相信我应该在 Bookshelf 类上编写一个方法,例如 AddBook(Book book)。
但是,如果有业务要求不能将同名书籍添加到书架上怎么办。我想要 Bookshelf.AddBook 方法中的一些逻辑来检查书籍的集合,以确保这本书不存在。
现在的问题是我不能这样做,因为我已经以一种很好的封装方式编写了 Book 对象,并且它的“Name”属性不可公开访问。
我知道这是一个相当人为的例子,但我希望它能更好地说明问题。我现在也意识到这不仅仅是 DDD 问题,而是现实中的 OO 封装问题。我敢肯定,必须有一种非常常见、简单的方法来解决我正在尝试做的事情,而且我在很大程度上想多了。