30

MVC 3 + EF 4.1

我在两种处理 DbContext 的方法之间进行选择:

  1. 实例化Application_BeginRequest,放入 HttpContext.Current.Items配置中Application_EndRequest
  2. 创建一次性 UnitOfWork (kindof wrapper for DbContext)并开始每个控制器动作using(var unitOfWork = new UnitOfWork()) { ... }

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

4

3 回答 3

18

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

 container.RegisterType<MyDbContext>().InstancePerHttpRequest();

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

public class MyController : Controller
{
    public MyController(MyDbContext myDbContext)
    {
         _myDbContext = myDbContext;
    }
}

如果注册的类型实现IDisposable了,那么 DI 框架将在请求结束时释放它。

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

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

于 2011-08-09T00:40:58.093 回答
2

我们目前使用通过存储库工厂中的服务定位器实例化的 UoW(工作单元)注入的存储库。Unity 以这种方式控制生命周期,让您远离工作。

如果您使用 POCO、实体对象等,您的特定实现会有所不同。

最终,如果您要在控制器中使用多个对象集以确保您只使用一个上下文,那么您最终需要 UoW。这将使您的交易受到检查等。

如果您要使用多个对象上下文(即多个 EDMX),您需要考虑将 UoW 与 MSDTC 结合使用……但这可能比您想知道的要多。最后,重要的是确保您只实例化控制器操作所需的内容(即上下文的一个实例。)。我认为我不会使用 Begin_Request,您甚至可能不需要每个请求的上下文。

于 2011-08-09T00:43:01.940 回答
-1

不要将 DbContext 放在 global.asax 中!:

  1. Global.asax 中 DbContext 的静态字段与控制器类中 DbContext 的实例字段?
  2. 实体框架上下文为静态
于 2011-08-08T20:33:06.287 回答