嗨,我刚刚读了《企业应用程序架构模式》一书。他们说你应该分层做企业应用程序,你不应该让一层使用上面的层,只使用向下的层......就像域层可以使用 DB 层,但反之亦然。然后有一章是关于创建域对象的 DataMappers。我有点想知道为什么他可以让DB层中的DataMapper在域层中创建一个对象,因为它不遵循底部不调用上层的规则。所以我的问题是实际上不应该是 DB 层中的域对象,或者什么是在不使 DB 层使用域层的情况下制作域对象的好方法
3 回答
我个人不同意 domain-model 是与其他层相同的层,因为它不包含任何行为,它只是一个与领域相关的实体/数据对象。
也就是说,我们不能断定它只对业务层是特殊的,如果你使用一些ORM组件,很明显Domain-Model是直接在你的数据库层中使用的,因为它是内部自动映射的。
我认为这里的问题是您对域模型做出了一些假设。
根据您提到的书,数据映射器实际上只需要富域模型,在这种情况下,最好不要使用实体 bean 作为域模型,而是使用 POJO。
现在,如果您采用这种方式,我认为数据映射器和域模型类位于同一层,位于持久层(由 DAO 和实体组成)之上。在这种情况下,数据映射器不会直接对数据库进行任何操作。
另一方面,如果域模型是基于实体的,那么我认为它也是持久层的一部分,并且在这种情况下,数据映射器也履行了 DAO 的角色,所以它们都是(在至少部分)在同一层。
最好的解决方案是什么?根据这本书,我会说仅在非常简单的情况下将实体用作域模型是有意义的,对于任何复杂的情况都要分开(参见该书第 9 章中的域模型)
解决您发现的问题的一种方法是在域对象和数据库之间使用抽象层。
简而言之,它的依赖倒置/注入。
您定义一个接口,定义数据提供者可以执行的所有操作,然后构建实现该接口的具体数据提供者,业务逻辑/领域层与之对话。这样你就不会被绑定到数据库。
然后,您可以在业务逻辑/数据对象和接口之间构建数据映射器(如果您想重用它),或者如果它需要特定于数据提供者的详细信息,则作为数据访问的一部分。