我需要为每个请求注入EF上下文。有没有办法实现它?
答案 0 :(得分:6)
您是否看过this关于DI与Unity和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。稍后您的存储库可能具有不同类型的上下文,您可以相互切换存储库。