有一个关于将persistent layer与domain layer分离以使domain layer更加健壮的概念--它将不依赖于persistence layer中存储库的实际实现,而只依赖于存储库接口。
这意味着我们有:
IPersonRepository {...} // in domain layer
PersonCassandraRepository implements IPersonRepository {...} // in persistence layer
Person (Aggregate Root) {...}那么Person呢?
在anemic-domain-model中,我们可以拥有:
IPerson {...} // in domain layer
Person implements IPerson {...} // in persistence layer为什么要把人放在持久层?
因为它包含特定于实现的代码。
例如,它可能包含与JPA相关的注释,与存储库一样,我们不希望在域层中存储特定的实现。
由于Person不包含任何域逻辑,因此我们可以使用贫血域模型来实现上述操作,这意味着我们可以将Person置于持久化层。
在贫血域模型中,数据与行为是分离的,因此人的行为是由分离的服务完成的,而不是在人本身中编写的。
我们不能用富域模型实现层分离,因为在这种情况下,Person确实包含特定于域的逻辑。
您将如何在富域模型应用程序中进行分层分离?
或者你认为这是不必要的。
发布于 2021-12-11 14:04:40
持久化的类不一定是域模型中的类(甚至实现相同的接口)。
因此,您可以在持久化层中拥有一个Person类,它只用于处理持久化层,并且没有真正的行为,而且可能不强制使用域不变量。在域层中,您有一个Person类,它执行不变量,并且不知道持久化。
然后,存储库在这种方法中的职责是在持久化层中的Person表示和域层中的Person表示之间进行转换。
发布于 2021-12-11 20:19:06
您将如何在富域模型应用程序中进行分层分离?或者你认为这是不必要的。
在这段对话中,老一套的文学作品往往会说:“哦,天哪,恐怕这就是我们今天的全部时间……”
设计是我们为了得到更多我们想要的东西而做的事情,而不是仅仅通过这样做就能得到的东西。-露丝·马兰
作为一项规则,您的业务逻辑并不关心管道的细节;运输容器的业务策略(或其他什么)独立于我们是将信息存储在文件系统上,还是存储在关系数据库中,还是在文档存储中,还是在事件存储中.
因此,我们“应该”在这两个层之间进行分离,这样我们就可以把其中一层换成另一层。
但要做到这一点所需的设计工作并不是免费的。如果你的结果是变化频繁且代价高昂,那么你就不会有一个愉快的时光。
另一种表达方式是:持久化层和域层之间不必要的耦合是技术债务的一种形式,但是承担技术债务可能是正确的决定。
IPerson {...} // in domain layer
Person implements IPerson {...} // in persistence layer如果您希望在域和持久性之间“分离”,这是不完全正确的;接口实际上不是域层的一部分,而是域层所依赖的契约的一部分。
一个“富域模型”有一个贫血的数据模型。它可能是隐式的,而不是显式的,或者隐藏在一堆包装器中,但是深入挖掘,您几乎肯定会找到一个int,或者一个双字节,或者一些其他通用的数据结构,这些数据结构本身并不真正实现域逻辑。
当您将域和持久性分开时,您可以决定域层将使用持久性提供的贫血数据模型,或者您可以决定只想在边界之间来回传递信息(值)。两者都能起作用,当然也有不同的取舍。
推荐
https://stackoverflow.com/questions/70314017
复制相似问题