【问题标题】:ASP.NET Core DDD Update domain model using the request ViewModelASP.NET Core DDD 使用请求 ViewModel 更新域模型
【发布时间】:2021-07-14 09:48:30
【问题描述】:

我正在学习 DDD 模式,我有以下问题。

在我的[HttpPut] API 端点上,我有一个请求命令模型,其中包含一些用于更新域模型聚合根的属性。

现在使用 DDD 更新我的域模型的正确方法是什么。

  1. 创建映射所有请求命令属性的域模型的新对象,并在更新方法Update(Model model) 中使用此对象。然后只更新填写更新的属性。

  2. 只需在更新方法Update(string prop1, string prop2, bool prop3)中一一传递所有属性即可。

  3. 创建一个新的域模型来代表更新Update(UpdateModel model)的所有属性。

【问题讨论】:

    标签: asp.net-core domain-driven-design


    【解决方案1】:

    我认为你在这里有点忽略了这一点。 DDD 战术模式与 CRUD 互斥。如果您的系统中仅有的命令是创建、更新和删除,那么您不会从 DDD 战术模式(如聚合和富模型)中受益很多。

    要做的第一件事是问自己,如果您没有错误地在本质上不是 CRUD 的域中强制使用 CRUD 模型。如果您正在考虑重构为 task-based UI 并避免使用 anemic domain model

    如果 CRUD 自然适合您的域(或子域),那么您可能会选择不那么严格的架构。例如,您可以使用自动映射(或显式映射器)将命令数据映射到服务中的实体(getter 和 setter 包)。

    您还可以将命令直接传递给实体并让它映射值,例如entity.update(command)。我是against that approach for rich models,但就像我对 CRUD 所说的那样,您可以做出纯度让步以保持务实,因为您主要是在设计一个美化的数据库编辑器。

    【讨论】:

    • 它不仅是 CRUD,我还有一个客户聚合根以及地址和联系人作为聚合。因此,在我正在管理的聚合根上使用方法会执行子聚合。也例如 SalesInvoice 我有方法来发布发票或 SetCustomer 用于在发票上设置客户等等。只是我们还有一些正常的 CRUD 任务,比如更新客户的一些主要属性。我是否应该因此而离开 DDD?
    • 找到另一个线程here,您在其中标记了一些帮助我更多地理解 DDD 的指针。在我的示例中,我最好有一个 UpdateCustomerContactDetails 命令来更新电话、电子邮件等,另一个用于更新帐单地址。
    猜你喜欢
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多