只是想知道,在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
什么会更好?
感谢。
答案 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)
我不确定“指向”是什么意思,但我认为交易是服务层的责任,而不是持久性。
持久性对象无法知道它是否属于更大的工作单元。负责服务引用构成工作单元的所有模型和持久性对象。该服务还负责代表持久性对象管理池中的连接。获取连接,打开事务,执行工作,提交或回滚事务,然后关闭连接。这是服务的工作。