我真的很難找出EF上下文在MVC應用程序中的管理位置。實體框架上下文?
我正在使用Service/Repository/EF方法,並使用UnitOfWork模式以及其內部的上下文進行播放,然後在控制器操作內部使用它來利用各種服務。它的工作原理,但通過這樣做,我使控制器依賴EF正確嗎?
有什麼建議嗎?
我真的很難找出EF上下文在MVC應用程序中的管理位置。實體框架上下文?
我正在使用Service/Repository/EF方法,並使用UnitOfWork模式以及其內部的上下文進行播放,然後在控制器操作內部使用它來利用各種服務。它的工作原理,但通過這樣做,我使控制器依賴EF正確嗎?
有什麼建議嗎?
如果您依賴抽象並創建封裝EF上下文的IUnitOfWork和IRepository,Controller將依賴於抽象而不是任何具體的實現。
存儲庫和工作單元本身是唯一依賴實體框架或您正在使用的任何ORM的類。
public class MyController : Controller
{
public MyController(IRepository r1, IRepository r2, IUnitOfWork uow)
{ ... }
[HttpPost]
public ActionResult SomeAction(Model data)
{
_r1.DoSomeChangesToEntities(data);
_r2.DoSomeChangesToEntities(data);
_uow.SaveChanges();
return View(...);
}
}
編輯爲每個請求:
一個簡單的工作單元實現可能是:
public class EFUnitOfWork : IUnitOfWork
{
private DataContext _context;
public EFUnitOfWork(DataContext context)
{
_context = context;
}
public void Commit()
{
_context.SubmitChanges();
}
}
你當然會確保您的服務/資源庫使用相同的上下文向工作單位注入相同的背景。
這取決於你的意思是「使控制器依賴於EF」?
你在控制器中使用任何EF相關的類嗎?如果不是,他們顯然不依賴於EF,並且您可以輕鬆地將您的存儲庫和工作單元交換爲其他實現(例如使用NHibernate)。
但是,整個你的asp.net mvc應用程序是依賴於EF如果你在任何層使用它 - 它不會運行沒有加載EF dll。
那麼UnitOfWork應該在哪一層生活? – Sam 2011-03-04 17:29:33
@Sam:我想你最近幾天已經問過這幾次了,你有答案。檢查他們。沒有理由每天再問一次。 – 2011-03-04 18:23:21
退房示例代碼在http://efmvc.codeplex.com/
雖然這可能在理論上回答這個問題,[這將是更可取的](http://meta.stackexchange.com/q/8259)在這裏包括答案的基本部分,並提供參考鏈接。 – Benjol 2011-03-04 14:24:35
@PH - 你能告訴我IUnitOfWork將是什麼樣子? – Sam 2011-03-04 08:33:40
@Sam - 增加了UnitOfWork的例子 – PHeiberg 2011-03-04 19:30:28