应用程序分层和DataMapper

时间:2011-08-29 08:36:58

标签: design-patterns architecture uml poeaa

您好,我刚刚阅读了“企业应用程序架构模式”一书。他们说你应该在图层中进行企业应用程序,并且你不应该让一层使用上面的层只有一层向下的层...像域层一样可以使用DB层但反之亦然。然后有一章关于创建域对象的DataMappers。我有点想知道为什么他可以在数据库层中创建一个DataMapper在域层中创建一个对象,因为它没有遵循底部不调用上层的规则。所以我的问题不应该是实际在DB层中的域对象,或者在不使DB层使用域层的情况下制作域对象的好方法

3 个答案:

答案 0 :(得分:0)

我认为这里的问题是你对域模型做了一些假设 根据本书,你提到数据映射器实际上只有丰富的域模型才需要,在这种情况下,最好不要将实体bean用作域模型,而是使用POJO。

现在,如果你这样做,我认为数据映射器和域模型类位于持久层(由DAO和实体组成)之上的同一层中。在这种情况下,Data Mapper不会直接使用数据库。

另一方面,如果域模型基于实体,那么我认为它也是持久层的一部分,并且数据映射器也在这种情况下履行DAO的角色,所以它们又是两者(至少部分地)在同一层中。

什么是最好的解决方案?根据本书,我认为仅在非常简单的情况下将实体用作域模型是有意义的,对于任何复杂的事物都要分开(参见该书第9章中的域模型)

答案 1 :(得分:0)

解决您发现的问题的一种方法是在域对象和数据库之间使用一层抽象。

简而言之,它的依赖倒置/注入。

定义一个接口,定义数据提供者可以执行的所有操作,然后构建实现接口的具体数据提供者,并且业务逻辑/域层与之对话。这样你就不会受到数据库的束缚了。

然后,您可以在业务逻辑/数据对象和接口之间构建数据映射器(如果要重用它),或者如果需要特定于数据提供者的详细信息,则作为数据访问的一部分。 / p>

答案 2 :(得分:0)

我个人不同意域模型是与其他层相同的层,因为它不包含任何行为,它只是一个与域相关的实体/数据对象。

也就是说,我们无法得出结论,它只对Business Layer有特殊意义,如果你使用一些ORM组件,很明显Domain-Model直接用在你的数据库层中,因为它是自动的 - 内部映射。