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

本文关键字:实体 两个 一个 模型 数据 软件体系结构 | 更新日期: 2023-09-27 18:34:19

**Update 2**

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

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

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

更新 3

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

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

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

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

您应该使用通过ORM映射的

全功能域模型或"贫血"数据模型(也通过ORM映射(。哪一个取决于您的背景、要求和个人喜好。

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

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

我写的东西有例外。在 CQRS 体系结构中同时使用数据实体和域实体是合法的。

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

与某些答案所暗示的相反,数据访问层不会为您的域实体补充水分,并且对它们没有深入的了解。相反,域层会向数据访问层询问重建实例所需的数据。

域模型应存在于尽可能多的位置,以最大程度地重用和理解代码。 使用域模型时,这种情况的例外情况在时间、内存或传输成本方面都非常昂贵。

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

此值对象可以是供应商对象的副本,仅包含您需要的部件,也可以是仅表示所需数据的全新类。

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

相关文章: