Dav*_*wer 11 architecture entities domain-driven-design entity-framework
我第一次开始使用Entity Framework Code First,并且我们围绕域构建我们的绿地应用程序而不是关系数据库表(这是我多年来的工作方式)给我留下了深刻的印象.
因此,我们正在构建C#中的实体,每次我们进行新的迁移时都会反映在数据库中.
我的问题是:这些相同的实体(即设计时考虑到实体框架)是否应该与域驱动设计中的实体扮演相同的角色(即代表域的核心)?
gui*_*e31 21
对象关系映射和域驱动设计是两个正交问题.
ORM
ORM就是为了弥合数据库中存在的关系数据模型与对象模型,任何对象模型之间的差距.
由EF定义的实体具体表示您希望将关系模型的某个子部分映射到(和从)的任何对象.事实证明,EF创建者希望通过命名实体来为这些人提供商业内涵,但最终没有任何东西会强迫你这样做.您可以映射到View Models,只关注它.
DDD
从DDD的角度来看,没有"为EF设计的实体"这样的东西.DDD实体应该是持久性无知且不承担任何ORM的痕迹.域层对其对象的存储方式,位置,是否或何时不感兴趣.
两者见面的地方
两个正交概念相交的唯一点是当您的ORM映射所针对的对象模型恰好是您的域模型时.这可以通过EF调用"代码优先"(但实际上应该命名为常规ORM),通过指向生活在非域层中的单独EF映射文件中的DDD实体,并避免使用EF工件(如数据注释)来实现直接在您的实体类中.使用Database First时这是不可能的,因为交易的DDD"纯度"部分将无法满足.
简而言之,这些术语相互冲突,但它们在概念上应该被视为两种不同的东西.一个是域对象本身,另一个是指针可以指示同一堆代码,但它可以指向其他任何东西.
Mik*_*eSW 16
它们不应该与为不同目的而设计的相同.ORM实体是一个或多个表的外观,其目的是在关系表之上模拟OOP.域实体是关于定义域概念.如果您的域实体仅仅是一个数据结构,那么您可以将其重用为EF实体,但这仅仅是一种情况.
DDD应用程序永远不会知道EF或ORM.它只知道一个存储库.因此,您的域对象(DO)不了解EF.您可以选择将它们视为EF实体,作为实现细节,但是......只有在定义了DO并且实现了它们的用例之后,才应该这样做.您应该尽可能地推迟持久性的实现(使用内存中的repos(列表)进行开发).
当您达到这一点时,您将知道您是否可以将您的DO重新用于ORM目的,或者您是否需要其他方式(例如纪念品).
请注意,在由域驱动时设计DO时,应考虑持久性问题,但不应受其影响,即不要根据db模式设计DO.每个DO的持久性策略可能不同,它可能涉及或不涉及ORM.
如果您正在使用事件采购DO,则ORM不存在.对于序列化对象也是如此.重要的是应用程序如何使用对象(更新和查询),这就是为什么我说你应该推迟持久性实现.对于很多DO,您不需要rdbms(即使您正在使用它),因此ORM实体看起来更像KeyValuePair(Id =>序列化数据).
总之,对于不同的目的,它们是不同的东西,对于某些情况(CRUD场景)可能看起来相同.
我会说,它们可以相同。
有时不需要支持两种模型。当您遵循代码优先方法时,您的实体为您的域建模,您的基础架构 (ORM) 将域和持久层分开。
这可能是合理的,维持两个车型,如果你有旧的数据库,并保持它。
还有另外两个 SO 问题可能会有所帮助:
| 归档时间: |
|
| 查看次数: |
8660 次 |
| 最近记录: |