.net core 在域驱动设计中,是否应通过AggregateRoot添加/更新实体?

.net core 在域驱动设计中,是否应通过AggregateRoot添加/更新实体?,.net-core,architecture,domain-driven-design,cqrs,.net Core,Architecture,Domain Driven Design,Cqrs,如果您有一个供应商,其中有一个联系人列表,在DDD中,向供应商添加联系人的更好方法是什么 下面是一些使用CQRS命令的示例C#代码 给定以下命令,我们应该如何实现向供应商添加联系人 AddVendorContactCommand() { string vendorId; string contactName; } 我们是否应通过供应商添加联系人: AddVendorContactHandler(AddVendorContactCommand command) { var

如果您有一个
供应商
,其中有一个
联系人列表
,在DDD中,向供应商添加联系人的更好方法是什么

下面是一些使用CQRS命令的示例C#代码

给定以下命令,我们应该如何实现向供应商添加联系人

AddVendorContactCommand()
{
    string vendorId;
    string contactName;
}
我们是否应通过供应商添加联系人:

AddVendorContactHandler(AddVendorContactCommand command)
{
    var vendor = await dbContext.Vendors.FindAsync(command.vendorId);
    vendor.AddContact(command.contactName);
    dbContext.Save();

    //doesn't require a dbSet for VendorContacts???
}
或者我们应该参考卖方合同,完全绕过卖方

AddVendorContactHandler(AddVendorContactCommand command)
{
    //handler
    var newVendorContact = new VendorContact(command.vendorId, command.contactName);
    dbContext.VendorContacts.Add(newVendorContact);
    dbContext.Save();

    //requires a dbSet for VendorContacts;
}
我觉得更好的方法是通过供应商,但这需要我们的
AddVendorContactCommand
首先从数据库中读取。在CQRS命令中,通常建议避免读取。直接使用
VendorContacts
的第二种方法比通过
Vendor
的方法具有更高的性能

要通过供应商的参数如下所示:

  • 如果供应商不存在怎么办
  • 如果不允许供应商再联系怎么办
  • 如果供应商被删除、禁用或以其他方式为只读,该怎么办

什么是正确的DDD方法?

首先,作为一名开发人员,我有义务说,任何事情都没有单一的正确方法

现在,考虑到您提供的信息,我将假设您描述的供应商实体可以(并且在我看来应该)是聚合根。考虑到这一点,我肯定会选择你描述的第一个选项

我认为您对CQRS命令有误解。在命令中从数据库获取数据是非常好的。您必须避免从查询端获取数据,这可能是一个完全不同的数据库


您也是正确的,对于VendorContact实体,您不需要使用
DbSet
,您应该在命令端保持这种方式,因为您希望保护vendorAggregate根中的不变量。

关于CQR的更多信息,您应该阅读本文,感谢您对我的想法的响应和验证。是的,供应商是聚合根。从允许对不变量进行最佳保护的最严格的设计开始。如果需要扩展,那么做出一些让步(最终的一致性,较小的ARs)。如果没有不变量,那么最小的AR可能是最好的,同时保持实用性(例如,不太细化)。