我真的很难弄清楚 EF 上下文在 MVC 应用程序中的管理位置。
我正在使用 Service/Repository/EF 方法,并且正在使用 UnitOfWork 模式及其内部的上下文,然后在控制器操作中使用它来利用各种服务。它有效,但是通过这样做,我使控制器依赖于 EF 对吗?
有什么建议么?
我真的很难弄清楚 EF 上下文在 MVC 应用程序中的管理位置。
我正在使用 Service/Repository/EF 方法,并且正在使用 UnitOfWork 模式及其内部的上下文,然后在控制器操作中使用它来利用各种服务。它有效,但是通过这样做,我使控制器依赖于 EF 对吗?
有什么建议么?
如果您依赖抽象并创建一个封装 EF 上下文的 IUnitOfWork 和 IRepository,则控制器将依赖于抽象而不是任何具体的实现。
存储库和工作单元本身是唯一依赖于实体框架或您正在使用的任何 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,它将根本无法运行。