Domain driven design DDD。我可以将我的值对象迁移到实体吗?

Domain driven design DDD。我可以将我的值对象迁移到实体吗?,domain-driven-design,Domain Driven Design,所以我尝试用DDD的方式重构重写我的应用程序。这是一个包含3个类的简单应用程序: 配置(名称) 环境(名称) 属性(键) 我使用它来查看和编辑每个环境的配置文件。一个配置可以被视为一个表,其中属性作为行,环境作为列 此时,配置是一个实体,环境和属性是值对象。但是现在我想要实现us ecase,为给定的环境将值设置为属性。我的第一个想法是: class Configuration(name) { environments = SetOf[Environment] propertie

所以我尝试用DDD的方式重构重写我的应用程序。这是一个包含3个类的简单应用程序:

  • 配置(名称)
  • 环境(名称)
  • 属性(键)
我使用它来查看和编辑每个环境的配置文件。一个
配置
可以被视为一个表,其中
属性
作为行,
环境
作为列

此时,
配置
是一个实体,
环境
属性
是值对象。但是现在我想要实现us ecase,为给定的
环境
设置为
属性
。我的第一个想法是:

class Configuration(name) {
   environments = SetOf[Environment]
   properties = SetOf[Property]

   setValue(property, environment, value) {
      knowEnv = environments.get(environment)
      knowEnv.setValue(property, value)
   }
}

class Environment(name) {
   properties = MapOf[Property, Value]

   setValue(property, value) {
     properties[property] = value
   }
}
但这样做会将我的
环境
从值对象更改为实体。所以我开始思考(太多),很难找到“最好”的解决方案。这就是为什么我来这里问你们,专家们,你们将如何实现这个用例


谢谢

从您发布的内容来看,它确实听起来好像每个
环境
都是具有身份的独特事物。我猜您的
环境可能是平台还是开发环境?所以它可能应该是一个实体

听起来你的
环境
可以独立于任何其他内容进行编辑、使用、创建等。在这种情况下,它可能不应该作为另一个聚合的一部分存在,因此它应该是它自己的聚合根(即使它只是一个实体)。因此,它将拥有自己的存储库。这一点在Evans DDD书中并不明显,但实体本身被视为聚合根(仅由一个对象组成)

如果希望从另一个聚合根引用
环境
,则可以通过其唯一id(而不是对象引用)引用它。然后,您需要另一种技术/方法来检索这些
环境


这似乎与旧的以数据为中心的教条背道而驰,但您可以做各种事情,比如数据缓存您的
环境
(因为数量可能有限,而且它们可能很少更改)或者使用CQR。

鉴于对这些问题的讨论和评论,我决定保持
环境作为值对象不变。设置属性值将生成一个新的
环境

class Configuration(name) {
   environments = SetOf[Environment]
   properties = SetOf[Property]

   setValue(property, environment, value) {
      knowEnv = environments.get(environment)
      updatedEnv = knowEnv.setValue(property, value)
      environments.replace(knowEnv, updatedEnv)
   }
}

class Environment(name) {
   properties = MapOf[Property, Value]

   setValue(property, value) {
     copy = new Environment(name)
     copy.properties = properties
     copy.properties[property] = value
     return copy
   }
}

它简单易用,适合我们的用例。

从您发布的内容来看,它确实听起来好像每个
环境
都是具有标识的独特事物。我猜您的环境可能是平台还是开发环境?所以它可能应该是一个实体。好的,谢谢。你说得对,它们是平台。所以你说它们应该是实体。但是,当我加载聚合时,我是否也可以加载这些实体,或者我是否可以从专用的
环境存储库加载它们?
?我已经复制了我以前的评论,并在“答案”中添加了更多内容,希望能回答您最后的评论。非常感谢。然而,虽然
环境在我的应用程序中似乎是独立的,但情况并非如此。
环境
附加到
配置
,并且在
配置
之外不可见。这是我设计关注的根源。@Anonymous“在外部不可见”不是聚合设计的有效启发式。您需要进行更多的事务性分析。哪些实体将一起更改,哪些实体需要从哪些数据中执行业务规则/不变量,并发访问量等等@guillaume31我同意,域对象之间的1:n关系并不一定意味着它们属于相同的一致性边界。