ASP.NET MVC按请求注入

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

Unity讨论列表中提出的解决方案是为每个请求创建一个子容器,让该子容器创建EF上下文作为ContainerControlledLifetime,然后将子容器放置在请求的末尾。 通过这样做,您不必创建自定义LifetimeManager。

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

Application_BeginRequest(...) { var childContainer = _container.CreateChildContainer(); HttpContext.Items["container"] = childContainer; childContainer.RegisterType (new ContainerControlledLifetimeManager()); } Application_EndRequest(...) { var container = HttpContext.Items["container"] as IUnityContainer if(container != null) container.Dispose(); } 

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

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

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

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

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

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

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

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

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