c# - 关于将实体映射到域对象的建议

标签 c# entity-framework domain-driven-design

<分区>

我目前在一个项目中工作,我们开始使用 DDD 方法构建应用程序。我们现在正在研究首先使用 Entity Framework 6 代码来帮助我们实现数据持久性。我的问题是如何最好地处理我们的域对象和 EF 实体之间的数据映射?

最佳答案

为了让您的应用程序和您自己长期保持清醒,永远不要以持久性相关问题(什么数据库、什么 orm 等)启动您的 DDD 应用程序,并且始终(是的,总是)将数据库作为开发的最后阶段.

为您的域建模,实际上除了持久性之外的任何其他模型。使用存储库模式使应用程序与持久性分离。根据应用程序的需要定义 repo 接口(interface),而不是绑定(bind)到数据库访问方法(这就是为什么您稍后要实现持久性,这样您就不会想将您的应用程序与持久性细节结合起来)。

为 repo 接口(interface)编写内存中实现,这通常意味着对列表或字典进行简单包装,因此编写速度非常快,更重要的是更改起来也很简单。使用这些来实际测试和开发应用程序。

在接口(interface)稳定且应用程序正常运行之后,就可以编写持久性实现,您可以在其中使用任何您想要的东西。在您的情况下,EF 就是映射。

现在,这是非常主观的,没有对错之分,只有你喜欢的做事方式。

就个人而言,我有使用备忘录的习惯,所以我从域对象中获取备忘录,然后手动将其映射到(微)ORM 实体。我手动执行此操作的原因是因为我的纪念品包含值对象。如果我要使用 AutoMapper,我将需要对其进行配置,本质上我将编写比手动执行更多的代码

更新(2015 年)

最近我只是对对象进行 Json 处理,然后使用特定的读取模型或将其直接存储在具有包含序列化对象的 Data 列的读取模型中。我只在非常特殊的情况下使用 Mementos。

根据域对象的外观和 EF 实体的外观,您可能会在大多数映射中使用自动映射器。不过,您将很难测试您的存储库。

这取决于您如何,找到适合您风格的方式并且易于维护,但永远不要设计或修改您的域对象以使其更兼容或匹配 ORM 实体。这与更改数据库或 ORM 无关,而是让域(以及应用程序的其余部分)与持久性细节(ORM 所在)适当分离。

因此,抵制重用其他层的实现细节的诱惑。应用程序分层结构的原因是因为你想要解耦。保持这种状态。

关于c# - 关于将实体映射到域对象的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20011041/

相关文章:

c# - WPF 中的 CommandLink

c# - Entity Framework : difference between Detach and AsNoTracking

c# - 无法在代码隐藏中访问 Asp.net 控件

c# - 是否可以在您的 web.config 中指定代理凭据?

c# - 什么是根目录或如何在 DotNetZip 中设置目录

mysql - Entity Framework 5.0 代码优先与 WPF 中的 MySQL

c# - 使用查找方法时 Entity Framework 抛出异常

domain-driven-design - DDD 处理随时间推移的聚合更新

domain-driven-design - 如何在 DDD 中使用巨大的域类?

c# - 决定用户类在应用程序中的位置