Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 横向骨料_C#_Domain Driven Design_Aggregateroot - Fatal编程技术网

C# 横向骨料

C# 横向骨料,c#,domain-driven-design,aggregateroot,C#,Domain Driven Design,Aggregateroot,阅读一下域驱动设计,您似乎应该通过从聚合根进行遍历来访问聚合中的所有实体 但是,与此同时,您应该真正尝试并封装数据,以便属性/字段受到保护或是私有的 因此,我的问题是:如果字段是受保护/私有的,您应该如何遍历聚合 目前我设置它的方式如下:我将域模型的所有属性标记为internal,将“setting”方法标记为protected。这样,至少模型外没有任何东西可以访问属性,但是模型内的对象可以访问其他对象属性,我仍然只允许从对象本身内设置属性 即使我已经这样做了,我仍然觉得这应该只适用于其他聚合实

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

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

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

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

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

有人对此有任何指导吗

编辑:

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

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

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

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


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

这是典型的遍历机制。

在存储的情况下公开属性没有什么错,父对象和子对象之间类似于构图的关系。子属性向父属性公开,但由于它们之间的强关系和相互依赖性,它不会破坏封装

换句话说,将Book的name属性公开给书架并没有错,但将Book的name属性公开给其他聚合则是错的(从DDD最佳实践的意义上讲)。公开可修改的藏书也是错误的。公开只读集合时应小心——这可能是破坏封装的标志


这回答了你的问题吗?

我认为这里所指的不是那种遍历类型。访问者模式允许我遍历对象图,并对图的每个节点执行操作。但是,我说的只是从父实体引用包含的对象,例如:var customerOrderLineItems=customer.Orders[0].OrderLines;你有两个选择。首先,有些人认为你不应该“接触”这样的物体。这表明您将对象图视为哑值持有者,而不是自包含、自管理的实体。如果一个操作对于一个类来说是足够完整的,那么它应该是该类上的一个操作,根据需要委托给私有包含的对象。如果您需要一个具有双重分派的解耦系统,那么访问者模式就是一个不错的选择。任何其他方法都会将多个方法与N*M关系集中的多个对象联系在一起:维护问题。它确实回答了这个问题,我想这就是我所说的过度思考的意思——这就像稍微放松规则并使属性可用一样简单,但只在聚合中可用。出现的问题是,您将使用什么C语言特性来允许在书架上访问图书名称,而不是访问该集合之外的类?(从一个c#assembly中一个有界上下文的不同聚合的角度考虑)