c# - 遍历聚合

标签 c# domain-driven-design aggregateroot

阅读有关域驱动设计的文章,您似乎应该通过从聚合根遍历来访问聚合内的所有实体。

然而,与此同时,您确实应该尝试封装您的数据,以便属性/字段受到保护或私有(private)。

因此我的问题是:如果字段是 protected /私有(private)的,您应该如何遍历聚合?

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

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

有人对此有任何指导吗?

编辑:

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

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

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

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

我知道这是一个相当人为的例子,但我希望它能更好地说明问题。我现在也意识到这不仅仅是一个 DDD 问题,而是一个现实中的 OO 封装问题。我确信一定有一种非常普遍、简单的方法来解决我正在尝试做的事情,但我对它的思考太多了。

最佳答案

在父子之间存在牢固的、类似组合的关系的情况下,公开属性没有错。子属性向父属性公开,但由于它们之间的牢固关系和相互依赖性,因此不会破坏封装。

换句话说,将 Book 的名称属性暴露给 Bookshelf 没有错,但将 Book 的名称暴露给其他聚合是错误的(在 DDD 最佳实践的意义上)。公开可修改的藏书也是错误的。应谨慎公开只读集合——这可能是破坏封装的迹象。

这是否回答了您的问题?

关于c# - 遍历聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3162495/

相关文章:

java - 另一个聚合根中的聚合根引用

c# - 如何在 WebBrowser 控件中启用 inPrivate 模式

c# - 在 C# 中使用 JavaBDD

c# - 验证值的优雅方式

domain-driven-design - 您能否建议DDD最佳做法

domain-driven-design - 如何在 DDD 中处理货币转换?

c# - 在 Xamarin Studio 中删除未使用的 using 语句和排序 using 语句的最佳方法?

go - 在DDD(纯净/六角形)架构中处理数据库连接和Env配置

design-patterns - 如何在 DDD 中正确设计模型的计算字段?

orm - DDD 中的领域对象建模哪一种更好?