Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DDD-跨有界上下文边界的聚合根标识使用_C#_Domain Driven Design_Cqrs_Event Driven Design - Fatal编程技术网

C# DDD-跨有界上下文边界的聚合根标识使用

C# DDD-跨有界上下文边界的聚合根标识使用,c#,domain-driven-design,cqrs,event-driven-design,C#,Domain Driven Design,Cqrs,Event Driven Design,在域模型中建模实体标识的一种建议方法是创建值对象,而不是使用基元类型(例如,在C#中): 在我看来,这些类应该在整个应用程序中使用,而不仅仅是在域模型中。与命令和事件一起,它们可以为有界上下文定义服务契约。现在,在一个具有多个有界上下文的消息/事件驱动体系结构中,每个上下文都有一个单独的服务契约,很容易陷入循环依赖 在有界上下文之间的通信中,您将有适配器和转换器,并且通常大多数属性将被处理为本地值。但如何处理生活在其他有界环境中的聚合根的恒等式呢? 这个问题的一个解决方案是为外部(远程)实体的标

在域模型中建模实体标识的一种建议方法是创建值对象,而不是使用基元类型(例如,在C#中):

在我看来,这些类应该在整个应用程序中使用,而不仅仅是在域模型中。与命令和事件一起,它们可以为有界上下文定义服务契约。现在,在一个具有多个有界上下文的消息/事件驱动体系结构中,每个上下文都有一个单独的服务契约,很容易陷入循环依赖

在有界上下文之间的通信中,您将有适配器和转换器,并且通常大多数属性将被处理为本地值。但如何处理生活在其他有界环境中的聚合根的恒等式呢? 这个问题的一个解决方案是为外部(远程)实体的标识类创建本地上下文同级类。但这在某种程度上违反了干燥原则。另一种方法是将所有有界上下文的契约放在一个程序集中。我在许多CQR示例中都看到了这一点,我认为这就是代码气味。作为最后一种解决方案,您可以将标识类分解回所有契约(事件和命令)中的基本类型,并让每个有界上下文在域模型中组合回其本地标识类(如果需要)。但这可能会导致复合身份(如UserId+TenantId)上的错误身份组合

您如何在项目中跨有限的上下文边界进行身份共享?

如果您在一个上下文中的客户在其他上下文中有不同的名称,例如销售线索或发货收件人,您会怎么做

如果他们每个人都有一个CustomerId,那么它就违背了一个上下文的概念和语言不泄漏到其他上下文中的目的


别误会,我完全赞成将聚合ID封装在值对象中。但是每个上下文都应该有各自的实现,它们的名称与每个上下文的通用语言相同。

说到这里,这是一个很好的答案。在我看来,当同一个实体同时存在于两种环境中(但有一个主环境,可能有不同的属性)并且以某种方式同步到下游时,这是必须的。但是在很多情况下,仅仅为了持有一个外来引用而人为地用新的基于角色的名称来丰富一个域中无处不在的语言是没有意义的。另一方面,在前端或集成层中处理同一概念的不同类型名称(隐式)可能会非常尴尬。重要的是要记住,在一个上下文中,类型(封装相同的原语值)称为CustomerId,而在另一个上下文中,它称为ReceipEntID。这种隐含的知识必须以某种方式明确化,可能需要一个互操作转换器。@Sebastian,这正是上下文映射的目的所在。DDD中描述的一个经常被忽略但仍然有用的工具。
public class CustomerId
{
  public long Id { get; set; }
}