繁体   English   中英

ASP.NET MVC按请求注入

[英]ASP.NET MVC inject per request

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

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

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

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

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

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

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

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

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();
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM