2

我真的很难弄清楚 EF 上下文在 MVC 应用程序中的管理位置。

我正在使用 Service/Repository/EF 方法,并且正在使用 UnitOfWork 模式及其内部的上下文,然后在控制器操作中使用它来利用各种服务。它有效,但是通过这样做,我使控制器依赖于 EF 对吗?

有什么建议么?

4

3 回答 3

1

如果您依赖抽象并创建一个封装 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();
  } 
}

您当然会通过向它们注入相同的上下文来确保您的服务/存储库使用与工作单元相同的上下文。

于 2011-03-04T08:23:08.370 回答
0

这取决于您的意思是“使控制器依赖于EF”?

您在控制器中使用任何与 EF 相关的类吗?如果不是,它们显然不依赖于 EF,您可以轻松地将存储库和工作单元交换为其他实现(例如使用 NHibernate)。

但是,如果您在任何层中使用它,整个 asp.net mvc 应用程序都依赖于 EF - 如果不加载 EF dll,它将根本无法运行。

于 2011-03-04T09:26:56.770 回答
0

在http://efmvc.codeplex.com/查看示例代码

于 2011-03-04T09:34:32.140 回答