【问题标题】:Abstracting Entity Framework in Domain Driven Design (how to avoid IDbSet)领域驱动设计中的抽象实体框架(如何避免IDbSet)
【发布时间】:2015-11-21 17:04:44
【问题描述】:

我正在尝试在领域驱动设计项目中使用实体框架。

在我的理解中,Domain 层应该不知道任何持久性实现。所以我有两个接口——IRepositoryIUnitOfWork。我在Data 层中提供了实现。

我的问题是我似乎找不到避免在IRepositoryIUnitOfWork 中使用实体框架的IDbSet 的方法。

我想问 2 个问题 - 我如何从 Domain 层抽象实体框架?而且 - 如果我切换到 NHibernate,我可以完全避免这个问题吗?非常感谢。

【问题讨论】:

  • 你可以使用 IQueryable 代替 IDbSet
  • 谢谢,我考虑过,但是我无法添加或插入数据。因为我需要对 DbSet. 的引用
  • 如果你在你的 Repository 方法实现顺便说一句,你可以将它转换回 IDbSet。
  • 为什么不能抽象出IDbSet?显示一些代码来说明你的观点。
  • @user4811392:你能详细说明为什么你不能在 repo/uow 中避免 IDbSet 吗?人们每天都这样做,不费吹灰之力。您提到的添加/更新不需要数据库集(它们在实现中需要数据库集,但在抽象中不需要)。那你有什么具体问题?

标签: entity-framework domain-driven-design


【解决方案1】:

在您的存储库接口上,定义查找方法,例如

Task<MyAggregate> FindById(MyAggregateId id);

以及诸如

之类的mutator方法
Task Update(MyAggregate aggregate);

这清楚地表明存储库在其接口上使用域对象 - 封装完成!

如果稍后切换到 NHibernate,则需要在域和服务层中更改以下内容:Nothing

注意:Task&lt;T&gt;Task 返回值之所以存在,是因为存储库交互最好异步实现。如果你不需要/不想要它,你也不需要任务包装器。

【讨论】:

  • 非常好!我还要补充一点,实现 repo 接口的存储库类将与 EF 一起位于 Infra/Data 层,只是为了向可能阅读的其他人清楚。如果他切换到 NHibernate,他只需更改存储库类代码,而不用担心域接口,就像你提到的那样。
猜你喜欢
  • 2011-01-05
  • 2013-05-21
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 2013-12-07
  • 2020-10-26
  • 1970-01-01
相关资源
最近更新 更多