实体框架 + 仓储模式 + 工作单元模式

15

我在考虑使用EF 4开始一个新项目,并查看了一些与仓储模式和工作单元的EF相关文章。

(http://tdryan.blogspot.com/2011/03/another-entity-framework-4-repository_15.htmlhttp://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx)

我正在使用第一个(part1,part2和part3)。它们非常相似。

在这种情况下,我是个新手。我对这两篇文章感到困惑。我已经建立了所有内容,但我不知道如何开始使用上下文并向其添加实体。我发布了第二个链接,因为它提供了一种实现方式。 ObjectContext派生自IUnitOfWork,所以我不确定应该选择哪个才更好。

2个回答

32

你的问题并不愚蠢!开始学习使用 UnitOfWorkRepository 模式需要一些时间。

首先,要正确理解一些术语。一个 UnitOfWork 封装了一组操作并将它们分组在一起。因此,你可以在一个逻辑组中创建客户、产品和相应的订单。

Repository 给你提供了访问实体的单一入口,并且大多数时候还有一些特定的方法用于检索数据。

多个仓储库可以在单个事务中使用,这就是它们共享一个 UnitOfWork 的原因。

在你提供的示例中,T4 文件创建了一些 Repository 接口。其中一个是只读的,具有选择实体的方法,但另一个 Repository 具有像 AddDelete 这样的方法。

因此,如果你想添加一个实体,你需要先构建一个 UnitOfWork,然后实例化一个与你正在处理的实体类型匹配的 Repository(例如 CustomerRepositoryProductRepository)。然后,你就可以使用 Add 方法将实体添加到 Repository 中。完成对仓储库的操作后,可以调用 UnitOfWork.Commit() 方法将更改保存到数据库中。

IUnitOfWork unitOfWork = new EFUnitOfWork();

IRepository<Customer> customerRepository = new CustomerEFRepository(unitOfWork);

Customer c = new Customer();

// init customer

customerRepository.Add(c);
unitOfWork.Commit();
在您发布的示例中,使用了StructureMap进行依赖项注入。这是一个完全不同的主题,但它意味着您不直接构造 UnitOfWork 和 Repository ,而是使用您设置的某些配置将它们“注入”到您的代码中。

1
我已经在自己的C# Repo/Unit of Work模式上工作了一段时间,一直想知道它是否正确。这正是我使用Ninject注入uow和repositories到mvc控制器中的方式。我的unitofwork持有一个与repos共享的DbContext类的副本。你解释得很好 :-) - matt_lethargic

1

如果你的项目是Web相关的,可以编写一个处理程序,在请求时启动事务,并在最后一步结束它。

我认为这里可以找到一个更简单的例子:https://github.com/ayende/CourseSampleApp 此外,你还可以在nhibernate中找到其他示例,满足你的需求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接