【问题标题】:Should I hydrate a domain object using a EF Entity?我应该使用 EF 实体对域对象进行水合吗?
【发布时间】:2015-04-06 17:51:39
【问题描述】:

对此有很多问题,但据我所知,没有一个可以解决这个问题。

域对象使用 EF 实体来水合它是错误的吗?一方面,这与纪念品非常相似。可以将 EF 实体视为 DTO 或活动记录。

另一方面,这似乎将域与 DAL 耦合(因为 EF 实体可以被视为 DAO)

编辑为了澄清我在这里询问的内容......我有一个不知道我的数据访问层的域模型。存储库返回我的 DO,但这些 DO 是使用 DTO 放在一起的。 DTO 是专门为存储库用来为 DO 补充水分而构建的属性包。因此,即使我的 DO 不依赖于 EF 实体,它们也依赖于 DTO,其唯一工作是从 EF 实体进行映射......所以我创建了专门用于设施水化的代码。这对我来说似乎有点臭。

我绝对不是在问 DO 是否应该使用 EF 来保持自身。我在问我是否可以从 EF 实体中读取以补充 DO。

【问题讨论】:

  • 通常,您从 EF 实体到域实体的转换将在您的持久层中,在存储库方法中完成。您的域实体对 EF 之类的东西一无所知。
  • @Matthew 你为什么要那样做?如果将域耦合到 DAL 有什么好处?
  • @guillaume31 没有任何好处。我的替代方案是什么?我创建了一个 DTO,它是实体的深层副本,并使用它?
  • @AdrianThompsonPhillips 同意,并且该实体是 POCO...我在想的问题是我应该应该使用什么?
  • @Matthew 如何使用 EF Code First + fluent API 直接映射到您的域对象?此外,“水合物”意味着根据数据库中的数据填充对象,我从未见过它以相反的方式使用。你到底想做什么?

标签: .net entity-framework domain-driven-design


【解决方案1】:

不要将 EF 实体保留在数据服务层之后。

部分原因是名称冲突。但是,即使您从未打算让您的产品在非 EF 平台上运行,您也应该从实际对象及其方法中抽象出它如何持久化的细节(EF 结构)。

我曾在 .NET 世界中使用 EF 生成的对象一直到 ASP .NET 层的多个项目有过亲身经历,但结果永远不会很好。当您这样做时,您将引入足够多的耦合,使您的应用程序在现实中从 n 层变为 1 层。

这是一个更好的方法 -

使用您的方法(保存、获取等)创建一个 IPersistenceService 接口。

为实体框架创建一个实现 - EFPersistenceService。

在您的每个方法中,将 EF 对象映射到您的实体模型 - 您可以使用自动映射器或其他技术轻松做到这一点。

您的应用程序的其余部分应该只通过 IPersistenceService 与数据库通信(将始终程序应用到接口规则)。

如果这看起来有点矫枉过正 - 问问自己将来如何通过拆分数据库 (CQRS) 来提高性能,或者是否出于性能原因必须将特定更新更改为存储过程?

【讨论】:

  • 这是真的,即使它没有像我(试图)理解它那样回答 OP 的问题。顺便说一句,您似乎基本上是在描述 DDD 中的存储库模式。
  • 是的,我明白了。但是您的答案和我的问题之间的主要区别在于您使用自动映射器来补充 DO。最终这是一个糟糕的解决方案,因为这意味着 DO 不能被水合,除非通过反射(例如 automapper 的工作方式)......没有纪念品来水合它,只有知道映射器的层才能实例化 DO.. . 我的问题有意义吗?
  • 您不必使用自动映射器 - 将持久性抽象到接口中的全部目的是允许对其进行更改而不影响调用代码。顺便说一句,您可以将持久性代码保存在存储库中,但在我看来,抽象出数据库调用并使其成为存储库的依赖项更有意义。
猜你喜欢
  • 2010-10-23
  • 1970-01-01
  • 2017-04-04
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多