C# 实体与值对象

C# 实体与值对象,c#,domain-driven-design,C#,Domain Driven Design,我正在尝试学习DDD并将其应用到一个新项目中,因此面临一个可能是非常基本的问题,但我可能错过了 有界上下文能否包含同一实体的实体以及值对象 我的问题产生的原因是,我们通常需要一个ViewModel,除了模型数据之外,它还必须保留更接近视图的细节。但在某些情况下,有界上下文可能在事务中使用某些实体作为引用对象 例如,让我们假设一个案例。假设我们有员工上下文,其中也有员工实体和部门实体。我们将拥有这两个实体的ID 可以在此域中创建/更新部门等。然后,我们也可以向该部门添加员工 现在,当我们显示员工时

我正在尝试学习DDD并将其应用到一个新项目中,因此面临一个可能是非常基本的问题,但我可能错过了

有界上下文能否包含同一实体的实体以及值对象

我的问题产生的原因是,我们通常需要一个ViewModel,除了模型数据之外,它还必须保留更接近视图的细节。但在某些情况下,有界上下文可能在事务中使用某些实体作为引用对象

例如,让我们假设一个案例。假设我们有员工上下文,其中也有员工实体和部门实体。我们将拥有这两个实体的ID

可以在此域中创建/更新部门等。然后,我们也可以向该部门添加员工

现在,当我们显示员工时,我们希望显示有关部门的一些信息,这些信息可能不需要整个部门实体。我们可能需要部门中大约50%的细节

我的问题是,在这种情况下,我们能否为部门提供另一个ValueObject?或者它会打碎什么东西

如果我不这样做,那么我将被迫在较低的级别上创建和修改部门的细节


我的想法有意义吗?

您必须明确区分域模型和UI关注点。在您的示例中,部门实体是一个域概念,而支持显示员工的部门摘要数据显然是一个UI工件

部门实体

  • 存在于域模型中
  • 可由该模型上的不同用例使用
部门汇总对象

  • 仅为支持特定视图而存在
  • 不是DDD意义上的值对象
  • 不存在于域模型中
那么你应该把部门总结课放在哪里呢?summary类是一个应用程序服务/UI问题,但持久化机制可能需要它以结构化方式在存储库接口上提供数据(如果您希望避免重新打包对象)


尝试将其放在应用程序服务附近,因为这是它在逻辑上所属的位置。根据您的体系结构,您将需要一个对象到对象的映射,以将数据从存储库中获取到摘要对象。

嗯,我想我得到了。因此,最好保留独立的视图模型和一个额外的服务,用于为摘要填充数据。但是将该摘要(在我的例子中是实体的缩小版本)作为价值对象(除了实体之外)有意义吗?它在结构上是一个价值对象,但我建议不要将其作为域模型中的“正常”价值对象,除非它真的是一个域概念。假设您有五个不同的摘要类,因为您需要五个具有不同细节的不同视图。现在,对于相同的域概念,您将在域中拥有5+1类!