ASP.NET MVC按请求注入

Sib*_*Guy 5 c# asp.net-mvc dependency-injection unity-container

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

RPM*_*984 6

您是否通过Unity和ASP.NET MVC 查看了这篇关于DI的优秀博客?

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

答案是肯定的,你可以 - 而文章告诉你如何.

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

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

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

是关于同一件事的另一篇(更新)文章,以"Nerdinner"为例.


PHe*_*erg 5

Unity讨论列表中提出解决方案是为每个请求创建一个子容器,让该子容器创建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();
}
Run Code Online (Sandbox Code Playgroud)