gpt4 book ai didi

c# - 如何对可以属于多个聚合的 ValueObject 进行建模

转载 作者:太空宇宙 更新时间:2023-11-03 12:34:06 25 4
gpt4 key购买 nike

我刚刚开始学习领域驱动设计,遇到了一些障碍。

我有一个多对多的关系,我正在尝试以 DDD 方式设计它。假设我有一个 Widget,它是我的聚合。小部件可以有一个选项列表,这些选项是描述小部件的值对象。

我认为存储库应该查询与小部件关联的值对象列表,并填充小部件上的选项属性,而不是在 EF 中创建多对多关系。

我的领域对象看起来像这样:

public class Widget{ 
public int Id{get;set;}
public string Name{get;set;}
public List<Option> Options{get;set;}
public int DefaultOptionId{get;set;}
}

/* Value Object aka Look Up*/
public class Option{
public int Id{get;set;}
public string Name{get;private set;}
}

数据库结构和数据:

  Widget Table Data
ID: 1 , Name: Widget 1, DefaultOptionId: 2
ID: 2 , Name: Widget 2, DefaultOptionId: 3

Option Table
ID: 1 , Name: Option Name 1
ID: 2 , Name: Option Name 2
ID: 3 , Name: Option Name 3
ID: 4 , Name: Option Name 4

Relationship Table
WidgetId: 1 , OptionId: 2
WidgetId: 1 , OptionId: 3
WidgetId: 2 , OptionId: 2
WidgetId: 2 , OptionId: 3
WidgetId: 2 , OptionId: 4

最佳答案

您提出的解决方案( repo 选项列表作为值对象)很好。小部件不能更改选项值对象,因此共享引用对小部件没有影响。

重命名一个选项不会改变这个解决方案,因为小部件只会在下次被 repo 重新水合时选择重命名的选项。

“值对象”的概念与使用上下文有关:在小部件上下文中,Option 是不可变的。在某些其他上下文中(例如“选项”),它可能是可变的(因此您可以重命名选项)。

另见 https://martinfowler.com/bliki/ValueObject.html

关于c# - 如何对可以属于多个聚合的 ValueObject 进行建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41626536/

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