gpt4 book ai didi

domain-driven-design - 一切似乎都是聚合根

转载 作者:行者123 更新时间:2023-12-02 08:31:04 25 4
gpt4 key购买 nike

我想为餐厅的菜单组合建模。我仅围绕 3 个概念创建了一个非常小的限界上下文:MenuCategoryProduct

菜单由不同的产品组成,每个菜单中的每个产品都放在特定的类别下(例如,类别是“参赛者”、“第一道菜”、“第二道菜”、“甜点”……)。

问题是对我来说一切都像是一个实体

例如,删除菜单时,不会删除任何产品或类别。其他 3 个概念时也会发生同样的情况。

关于 UI,菜单将像层次结构一样使用:

Menu1
Category1
Product1
Product2
Category2
Product3
Product4

我想知道如何对此建模。我应该把它们做成 3 个聚合体吗?那么,应该如何组合一个 Menu 才能像上面的层次结构一样被消费?

谢谢。

最佳答案

如果您有一个菜单作为当前排列的聚合根,那么如果您想在不同的菜单上重复使用相同的产品会怎样?在聚合根之外,您将无法持有对它的引用。

相反,我认为将 Menu 和 Product(问厨师他会怎么称呼食物或菜单项!)作为聚合根很好,因为它们都存在并且有自己的身份(随着时间的推移,你可能会有不同的菜单,菜单可能包含已在其他菜单上使用过的食物)。

将类别作为值对象可能更合适(同样,也许厨师会称其为类(class)?)- 您有多少类别(我相信这些类(class)可能是固定的)?类别是否有自己的生命周期和身份?每个产品上的枚举可以很好地满足这一要求。

您还提到了删除……这听起来像是一个技术基础设施术语。这有两个问题:

  1. 如果您执行上述操作并拆分为两个聚合根(菜单和产品),当菜单引用产品时,您将如何处理产品的删除?这变成了跨越两个聚合根的事务,这很难实现(DDD 的主要思想之一是定义事务边界和通过聚合执行不变量——从外部对聚合根进行的任何外部操作都应该使其处于一致状态).

  2. 想一想厨师或餐厅经理会怎么做 - 他们会删除菜单,还是会存档菜单或使其不再可供选择?

有助于巩固上述内容的资源是 Vaughn Vernon 的 Effective Aggregate Design - http://dddcommunity.org/library/vernon_2011/

就代码而言,C# 中的伪模型如下:

public Object HandleGetMenuCommand(
string menuName,
IMenuRepository menuRepository,
ProductRepository productRepostiory)
{
Menu menu = menuRepository.Get(new MenuId(menuName));
List<ProductIds> productsInMenu = menu.Products;
List<Products> products = productRepostiory.GetMany(productsInMenu);
List<string> categories = ... // get a list of unique categories from products

// now assemble products by category...
foreach(var category in categories)
{
var productsInCategory in products.Find(x => x.Category == category);
foreach(var product in productsInCategory)
{
// add this to a list...
}
}

var clientData = new {
name = menu.Name,
// add in the products that were assembled by category above
}

return clientData;
}

关于domain-driven-design - 一切似乎都是聚合根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26722509/

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