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

C# 领域模型实体与数据实体,软件体系结构中的一个或两个,c#,java,design-patterns,architecture,domain-driven-design,C#,Java,Design Patterns,Architecture,Domain Driven Design,我有一个典型的3层结构(UI/域/数据层)的项目。在域层和数据实体层中同时使用域模型实体的优缺点是什么 更改为不同数据库的可能性很小。在数据层中只有数据实体作为域模型实体的利弊是什么?如果使用ORM有什么区别(当使用ORM(NHibernate)时,两个实体都有是好的做法吗) 请点燃你的想法,或链接,文章,书籍 更新3 在什么情况下我们应该同时使用域实体和数据实体?域模型应该存在于尽可能多的地方,以最大限度地实现代码重用和理解。当使用域模型时,无论是在时间、内存还是在传输成本方面,都会出现异常昂

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

更改为不同数据库的可能性很小。在数据层中只有数据实体作为域模型实体的利弊是什么?如果使用ORM有什么区别(当使用ORM(NHibernate)时,两个实体都有是好的做法吗)

请点燃你的想法,或链接,文章,书籍

更新3


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

域模型应该存在于尽可能多的地方,以最大限度地实现代码重用和理解。当使用域模型时,无论是在时间、内存还是在传输成本方面,都会出现异常昂贵的情况

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

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


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

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

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

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

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

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


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

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


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

谢谢!!当使用ORM时,两个实体都有是好的做法吗?你根本不需要“数据实体”。如果你使用好的ORM,它会为你做映射。这就是ORM的全部目的。数据层中的实体既是域模型实体又是数据实体吗?@乒乓球的正常做法是在域层和瘦数据访问层中都使用域实体。但也要记住,将域实体发送到UI并不是很好的做法。通常是一组dto对象,用于为UI提供数据。在什么情况下,我们应该同时使用域实体和数据实体?根据您的解释,在某些情况下,域模型可以存在于所有3个层中,而不存在任何数据实体,例如Dmitry的同类解释?是的。绝对地这是一个性能与易维护性的问题。编写和维护与域模型直接交互的代码更容易。
**Update 2**