工作单元是否应指向服务层或存储库?

时间:2011-01-26 02:26:17

标签: entity-framework-4 asp.net-mvc-3

只是想知道,在ASP.NET MVC3环境中使用实体框架。工作单元是应该指向服务层还是存储库(然后存储库指向服务层)?

我看到了两个例子:

  • 工作单元和存储库都具有服务层实例的工具..

链接:Entity Framework 4 CTP 4 / CTP 5 Generic Repository Pattern and Unit Testable

不使用服务层,但显然可以在这种情况下使用服务层。

  • 其次,工作单元具有存储库的实例,该实例具有服务层的实例..

链接:http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit- of-work-patterns-with-entity-framework-4-0.aspx

什么会更好?

感谢。

2 个答案:

答案 0 :(得分:4)

实际上,如果您考虑一下,控制器应该与工作单元一起使用。

通常在ASP.NET MVC应用程序中,当HTTP请求进入时,会为Controller分配一个新的工作单元。

然后,Controller将调用服务上的方法(调用存储库中的方法),获取并更改Entity Framework内部图形/内存。

一旦Controller完成了它需要做的事情,它将在工作单元上执行“提交”,这将导致对底层存储库的任何更改被提交到数据库。

我假设当您谈论“服务”时,您在Controller和Repository之间有一个中间层,Controller只与服务进行通信,然后服务与存储库进行通信,然后备份应用程序堆栈。 / p>

所以您的Controller可能如下所示:

public class ProductsController : Controller
{
   private IUnitOfWork _unitOfWork;
   private IProductsService _service;

   public ProductsController(IUnitOfWork unitOfWork, IProductsService service)
   {
      // use dependency injection here
      _unitOfWork = unitOfWork;
      _service = service;
   }

   [HttpPost]
   public ActionResult SubmitOrder(Product p)
   {
      var existingProduct = _service.FindById(p.ProductId);
      UpdateModel(existingProduct);
      _unitOfWork.Commit();
   }
} 

在大多数EF4场景中,工作单元是作为ObjectContext的包装器实现的。换句话说,您的工作单元上的“提交”方法只会在ObjectContext上执行“SaveChanges”。

因此,工作单元并不真正指向服务或存储库。它只适用于管理的持久性机制。

答案 1 :(得分:2)

我不确定“指向”是什么意思,但我认为交易是服务层的责任,而不是持久性。

持久性对象无法知道它是否属于更大的工作单元。负责服务引用构成工作单元的所有模型和持久性对象。该服务还负责代表持久性对象管理池中的连接。获取连接,打开事务,执行工作,提交或回滚事务,然后关闭连接。这是服务的工作。