域模型实体与数据实体,软件架构中的一个或两个

时间:2012-05-16 21:16:45

标签: c# java design-patterns architecture domain-driven-design

**Update 2**

我有一个具有典型3层结构(UI /域/数据层)的项目。在域层和数据实体层中同时拥有域模型实体的优缺点是什么。

改变到不同数据库的可能性很小。仅将数据层中的数据实体作为域模型实体的优缺点是什么?如果使用ORM有什么区别(当使用ORM(NHibernate)时,两个实体都是好的做法)?

请发布您的想法,或链接,文章,书籍。

更新3

在什么情况下我们应该同时使用域实体和数据实体?

4 个答案:

答案 0 :(得分:1)

假设您的问题与DDD有关。在典型的DDD场景中,域实体由数据层“水合”(由于它使用ORM,因此通常很薄)。为了水合域实体,数据层必须具有对域的深入了解。如果您使用ORM而不是您可能不需要单独的“数据实体”,ORM知道如何重新构建您的Domain对象。希望这会有所帮助。

答案 1 :(得分:1)

将数据实体与域实体一起使用是一件棘手的事情,并且在不添加任何值的情况下添加另一个不必要的抽象层。

您应该使用通过ORM映射的全功能域模型或“贫血”数据模型(也通过ORM映射)。哪一个取决于您的背景,要求和个人喜好。

在数据模型的情况下,您可能直接将表映射到实体(一对一),而不需要任何复杂的东西,如继承层次结构映射。没关系。棘手的是映射1:n关系。对于数据模型,如果您不在对象模型中表示“多”方面,它们往往可以很好地工作。为什么?因为如果你不添加自定义代码来处理这些情况,两个关系端很容易不同步。

对于域模型,您可能使用存储库来获取聚合根。

我所写的内容有例外。在CQRS架构中使用数据实体和域实体是合法的。

答案 2 :(得分:1)

如果您的数据架构没有准确映射到您的域实体,则使用数据实体。例如,考虑一个电话号码。在您的域实体中,它可能是一个单独的属性,而在数据库中,它可能包含区域代码字段和电话号码字段。

与某些答案所暗示的相反,数据访问层不会对您的域实体进行水合,也不会对它们有深入的了解。相反,您的域层会向您的数据访问层询问重建实例所需的数据。

答案 3 :(得分:0)

域模型应该存在于尽可能多的地方,以最大化代码重用和理解。如果使用域模型在时间,内存或运输成本方面都非常昂贵,那么这种情况就是例外。

假设您有零件供应商。这个供应商为您提供了数千个零件,因此在这种情况下,一对多可能是巨大的,特别是考虑到每个零件可能带来的类网。但是,您需要特定供应商的特定窗口小部件列表。在这种情况下,您只需使用所需的数据创建一个值对象。

此值对象可以是供应商对象的副本,只包含您需要的部分,或者它可以是仅代表您所需数据的全新类。

典型的用例可能是在网页上显示数据,以及通过json传输数据。