gpt4 book ai didi

c# - 遍历聚合

转载 作者:太空宇宙 更新时间:2023-11-03 14:28:46 24 4
gpt4 key购买 nike

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

然而,与此同时,您确实应该尝试封装您的数据,以便属性/字段受到保护或私有(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com