我想有一个或多个可重用类的库,基本上是值对象,如地址,PhoneNumber, emailaddress,包含大部分属性和一些支持方法。我的领域层如何在不违反领域层不应包含外部引用的规则的情况下使用这些,并且不将它们定义为领域层中的接口/抽象类?
我认为你对"外部参考"的定义需要重新评估一下。很难想象一个不引用任何东西的域层。在c#和Java中,你至少会引用基本的数字类型、日期和字符串。我也不认为引用像Noda/Joda time这样的外部库有什么害处。另一方面,你当然不想引用任何沉重的技术库,如持久化、通信、UI等。…而不违反域层不应该包含外部引用的规则
所以我想说的是,您可以构建自己的可重用库,但这需要非常仔细的考虑,并且通常不值得它将创建的耦合。对于每种类型,我将使用以下标准:
- 应该与上下文无关。例如,EmailAddress相对独立于使用它的上下文。另一方面,Address可能有不同的含义,这取决于有界上下文。
- 应该是稳定的(不经常改变)。
- 不应该隐藏任何进程外通信(数据库,网络等)
- 不应该有任何自己的依赖关系(除了标准的Java/c#)
我想你指的是共享内核。
共享内核——这是两个团队共享内核的子集域模型。在没有其他团队参与的情况下,这是不应该改变的咨询。
虽然这一开始看起来很棒,但由于我们被要求不要重复自己,因此要注意陷阱:
- 这些概念在任何情况下都应该具有相同的含义。根据上下文,其中一些概念具有微妙的细微差别。问你的领域专家。
- 更改更昂贵;复制这几个类,这样你就可以自己更改它们,而不是在某些更改时咨询多个团队,这可能更便宜。
稳定性有利有弊。如果您将一个实体拉到每个域中,那么任何更改都必须跨多个项目执行。如果您不这样做,那么必须跨多个域协调更改。前者的后勤比后者容易,但后者涉及的工作可能更大。无论哪种方式,您都必须在每个平台上测试更改。
除非实体是成熟的,具有相对定义良好的语义,否则我的经验是几乎所有的东西都会改变。所以稳定性很好,但可能有点转移注意力。
话虽如此,我喜欢(和+1)@Dmitry。