C# ASP.NET MVC按请求注入

C# ASP.NET MVC按请求注入,c#,asp.net-mvc,dependency-injection,unity-container,C#,Asp.net Mvc,Dependency Injection,Unity Container,我需要为每个请求注入EF上下文。有什么方法可以实现吗?注射是什么意思?你的意思是应用依赖倒置原理吗?如果是的话,那么您是否曾设想过自己将EF上下文替换为遵守相同合同的其他上下文 对我来说,您应该在框架中的某个地方封装EF上下文,以便每个请求都获得EF DataContext。在存储库上应用DI。稍后,您的存储库可能会有不同类型的上下文,您可以彼此切换存储库。您是否查看了Unity和ASP.NET MVC在DI上的优秀博客 应该会让你走上正轨 答案是是,你可以——这篇文章向你展示了如何做到这一点

我需要为每个请求注入EF上下文。有什么方法可以实现吗?

注射是什么意思?你的意思是应用依赖倒置原理吗?如果是的话,那么您是否曾设想过自己将EF上下文替换为遵守相同合同的其他上下文

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

您是否查看了Unity和ASP.NET MVC在DI上的优秀博客

应该会让你走上正轨

答案是是,你可以——这篇文章向你展示了如何做到这一点

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

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

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

是另一篇(更为最新)关于同一问题的文章,以“nerbinent”为例。

Unity讨论列表中的内容是为每个请求创建一个子容器,让该子容器将EF上下文创建为ContainerControlled Lifetime,然后在请求结束时处理子容器。通过这样做,您不必创建自定义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();
}
Application\u BeginRequest(…)
{
var childContainer=_container.CreateChildContainer();
HttpContext.Items[“container”]=childContainer;
childContainer.RegisterType
(新的ContainerControlled LifetimeManager());
}
应用程序请求(…)
{
var container=HttpContext.Items[“container”]作为IUnityContainer
if(容器!=null)
container.Dispose();
}

您使用的是Unity还是其他IoC容器?如果您看到您建议的帖子,那么他正在按照我的建议对存储库进行DI,并在其他地方封装DataContext。然后在repository方法中,作者从某个中心位置获取DataContext。我看到了您的建议,我同意(我也使用repository/UoW)。然而,这不是一个关于设计模式的问题,而是一个关于DI的上下文范围的问题,我希望我的回答能对你有所帮助。我喜欢StructureMap内置的HttpContext作用域,这与问题的解决方式相同。是的。这就是我选择StructureMap而不是Unity的原因。HTTP上下文范围应该构建到Unity中——我不知道为什么它不是。不应将单例用于db连接。由于担心依赖关系,它不是内置的-如果我们将HttpContextLifetime放在一起,则DLL不能与.NET 4.0客户端配置文件一起使用。是的,我见过这种模式,在StructureMap()中提出了一种类似的模式,您也参与了其中。最后,我不需要这样做(谢天谢地,因为我不喜欢在begin/disposing In end中创建DC的想法)。容器从何而来?我认为我理解子容器的概念,但是如何在请求开始时获得父容器呢?我想这可能在类似的情况下对我有所帮助situation@RobD-App_启动期间,_容器通常由您初始化(根容器的初始引导)。非常感谢PHeiberg,现在有意义了