3
**Update 2**

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

更改为不同数据库的可能性很小。仅将数据层中的数据实体作为域模型实体的优点和缺点是什么?如果使用 ORM 有什么区别(使用 ORM (NHibernate) 时同时拥有两个实体是否是一种好习惯)?

请激发你的想法、链接、文章、书籍。

更新 3

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

4

4 回答 4

1

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

于 2012-05-16T21:49:46.293 回答
1

将数据实体与域实体一起使用是一件棘手的事情,它会添加另一个不必要的抽象层,而不会增加任何价值。

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

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

在域模型的情况下,您可能使用存储库来获取聚合根。

我写的有一个例外。在 CQRS 架构中同时使用数据实体和域实体是合法的。

于 2012-05-17T06:23:07.817 回答
1

如果您的数据模式未准确映射到您的域实体,则使用数据实体。例如,考虑一个电话号码。在您的域实体中,它可能是一个单一属性,而在数据库中,它可能由一个区号字段和一个电话号码字段组成。

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

于 2012-05-17T11:26:05.543 回答
0

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

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

这个值对象可以是供应商对象的副本,只包含您需要的部分,或者它可以是一个全新的类,只表示您需要的数据。

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

于 2012-05-16T21:27:35.380 回答