在MVC中实例化和处理DbContext的最佳方法是什么?

YMC*_*YMC 30 asp.net-mvc entity-framework poco entity-framework-4.1 dbcontext

MVC 3 + EF 4.1

我在两种方法中选择处理DbContext:

  1. 实例化Application_BeginRequest,投入 HttpContext.Current.Items和处置Application_EndRequest.
  2. 创建一次性UnitOfWork(用于包装DbContext),并启动每个控制器操作using(var unitOfWork = new UnitOfWork()) { ... }

请分享您的经验:您更喜欢哪一个?每种方法的利弊是什么?

Era*_*nga 18

我建议你使用依赖注入框架.您可以DbContext根据要求注册

 container.RegisterType<MyDbContext>().InstancePerHttpRequest();
Run Code Online (Sandbox Code Playgroud)

并将其作为构造函数参数注入控制器.

public class MyController : Controller
{
    public MyController(MyDbContext myDbContext)
    {
         _myDbContext = myDbContext;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果注册类型实现,IDisposable那么DI框架将在请求结束时处理它.

第一种方法:使用ID框架要比手动实现它要清晰得多.此外,您的所有请求可能都不需要您的UoW.

第二种方法:控制器不应该知道如何构建你的UoW(DbContext).目的不是减少组件之间的耦合.

  • 引入服务层并向Controller注入服务.服务可以有许多存储库和存储库依赖于使用EFDbContext的UnitOfWork包装.然后使用DI注入那些依赖关系.然后你可以获得分离关注的优势. (3认同)