.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可能是最好的,同时保持实用性(例如,不太细化)。