【问题标题】:Entity Framework, Repository Pattern, Unit of Work and Testing实体框架、存储库模式、工作单元和测试
【发布时间】:2012-04-25 18:26:28
【问题描述】:

所以我一直在尝试重新设计我最近投入生产的项目中的数据访问。

我开始阅读有关存储库和工作单元模式的内容,这让我很感兴趣。我以前从未使用过 TDD,但我想我可以试一试。

我的工作并不重要,所以对我来说,更好地了解更多的是一种爱好。

我有一些工作,但想看看我是否完全错过了标记。这就是我所拥有的......(为简单起见,我将使用 Sln 而不是解决方案的名称)

Sln.DataAccess
+ Entities
  + Person.cs (contains the model definition of a Person)
  + IIdentifiedObject.cs (just an interface demanding a (Guid)Id property)
+ Repositories
  + IRepository.cs[1]
+ IUnitOfWork.cs[2]

Sln.DataAccess.Memory
+ PersonRepository.cs[3]
+ Context.cs[4]
+ GenericRepository.cs[5]
+ UnitOfWork.cs[6]

Sln.DataAccess.Sql (I suppose this could be Sln.DataAccess.EF but anyway...)
+ PersonRepository.cs
+ Context.cs
+ GenericRepository.cs
+ UnitOfWork.cs

Sln.Test
+ Various unit tests.

SQL 上下文/存储库/等...本质上都是相同的,只是它通过实体框架而不是内存列表访问数据库。

我要问的真正问题是我是否错过了整个 Repository/UnitOfWork 模式的标记,或者是否有任何建议任何人都可以提出我可以改进的地方。

这里是源文件。

【问题讨论】:

  • 我还会添加一个RepositoryFactory 来构建正确的存储库类型。
  • 你建议它放在哪里?我正在尝试做的是从数据访问中完全抽象出数据定义。因此,为什么我将 .Memory 和 .Sql 程序集分开。 .Memory 程序集永远不会包含在生产中。

标签: c# .net entity-framework repository-pattern unit-of-work


【解决方案1】:

没有建立存储库的标准方法。它旨在抽象 something,但对于不同的人来说,某些东西可能是不同的东西。有些人有通用查询方法,有些人只在 repo 本身有专门的查询。

我会首先考虑用例,然后设计存储库以适用于这些用例。设计一个地址簿应用程序,并考虑您的存储库是否可以方便地提供必要的功能。

【讨论】:

  • 我想了很多,我正在寻找的是关于如何做得更好的建议。我考虑做的一件事是为每个实体都有一个从 IRepository 继承的接口,但不确定这是否过度杀戮。我还想做的是在 .DataAccess 命名空间中以某种方式拥有 Context(在两个实现中都使用),但是 EF 与 DbSet 的紧密耦合使得这几乎是不可能的。
  • 你可以创建一个通用的 Query() 方法:return context.Set().AsQueryable();这样,每个工作单元只需要一个 repo(并且只有一个实例)。你也可以通过这种方式进行连接。
【解决方案2】:

好的,所以我实现了我想要的。

查看我在 Git 上创建的这个项目(它应该是打开的),它正是我想要的。

Sln.DataAccess 程序集对数据实际存储方式的引用绝对为零,其中没有类,只有定义访问对象方式和这些对象结构的接口。

实际的持久化方式(内存或数据库)完全隐藏在它们各自的程序集之外。

https://github.com/bmckenzie/projects

我想修复的一件事是我的内存中 Context 类中的 Set<>() 方法,请看这里:https://github.com/bmckenzie/projects/blob/development/Projects.DataAccess.Memory/Context.cs

如果有人有任何建议,我宁愿避免使用 if() {} 并使用某种字典?

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多