ASP.NET MVC按请求注入

时间:2010-10-10 06:36:57

标签: c# asp.net-mvc dependency-injection unity-container

我需要为每个请求注入EF上下文。有没有办法实现它?

3 个答案:

答案 0 :(得分:6)

您是否看过this关于DI与Uni​​ty和ASP.NET MVC的优秀博客?

应该让你走上正确的轨道。

答案是,你可以 - 文章会告诉你如何。

简而言之,您创建了一个HttpContextLifetimeManager来处理对象的“范围”。容器在HTTP上下文中“缓存”实例。

这是必需的,因为Unity提供的默认生命周期管理器不包括“现成的”HTTP上下文范围。

当然,其他DI容器(例如我使用的StructureMap)也可以。

Here是关于同一件事的另一篇(更新)文章,以“Nerdinner”为例。

答案 1 :(得分:5)

Unity讨论列表中的solution proposed是为每个请求创建一个子容器,让该子容器创建EF上下文作为ContainerControlledLifetime,然后在请求结束时放置子容器。通过这样做,您不必创建自定义LifetimeManager。

我对Unity不是很熟悉,但原则是这样的:

Application_BeginRequest(...)
{
  var childContainer = _container.CreateChildContainer();
  HttpContext.Items["container"] = childContainer;
  childContainer.RegisterType<ObjectContext, MyContext>
     (new ContainerControlledLifetimeManager());
}

Application_EndRequest(...)
{
  var container = HttpContext.Items["container"] as IUnityContainer
  if(container != null)
    container.Dispose();
}

答案 2 :(得分:1)

注射是什么意思?你的意思是对它应用依赖倒置原则吗?如果是,那么您是否曾设想将自己的EF背景与其他符合相同合同的背景交换出来?

对我来说,你应该在框架中的某处封装EF上下文,以便每个请求都获得EF DataContext。在您的存储库中应用DI。稍后您的存储库可能具有不同类型的上下文,您可以相互切换存储库。