Unity Lifetime Managers& EF数据上下文 - >最佳实践

时间:2013-08-15 12:57:17

标签: entity-framework asp.net-mvc-4 dependency-injection unity-container httprequest

所有

有很多关于Unity Lifetime Managers的帖子,但我还没有发现有人说“在这些情况下你应该总是使用X”这是一个很好的经验法则。让我描述一下我的应用程序,我有一个ASP.NET MVC 4 Web应用程序。我有一个包含3个项目的Visual Studio解决方案,我的'Core'项目,包含我所有的EF内容,测试项目和MVC Web项目。我使用Unity进行依赖注入,现在有以下代码:

// Context
container.RegisterType<IDatabaseFactory, DatabaseFactory>(
    new ContainerControlledLifetimeManager();
container.RegisterType<UnitOfWork>(
    new ContainerControlledLifetimeManager());

但是,我注意到我的上下文没有重新创建每个新的Web请求,这是我认为我想要的(如果我在这个假设中错了,请告诉我)。我很难分析下面列出的网站中的所有信息,并且已经阅读了很多人创建自己的名为PerHttpRequestLifetimeManager的类来处理这个问题。

这里最好的做法是什么?

  1. 通过Microsoft开发人员网络了解终身经理 - http://msdn.microsoft.com/en-us/library/ff660872(v=PandP.20).aspx
  2. MVC DI&amp;通过CodeProject与Lifetime Manager实现统一 - http://www.codeproject.com/Articles/424743/MVC-DI-Unity-with-Lifetime-Manager
  3. ASP.NET MVC提示:通过Shiju Varghese的博客使用Unity应用程序块进行依赖注入 - http://weblogs.asp.net/shijuvarghese/archive/2008/10/24/asp-net-mvc-tip-dependency-injection-with-unity-application-block.aspx
  4. MVC,EF - 通过堆栈溢出在Unity中的DataContext单例实例Per-Web-Request - MVC, EF - DataContext singleton instance Per-Web-Request in Unity
  5. 使用Unity通过堆栈溢出跨多个类型注入相同的DataContext实例 - Inject same DataContext instance across several types with Unity

1 个答案:

答案 0 :(得分:9)

是的,您通常需要每个请求一个DbContext。

每个请求创建的PerHttpRequestLifetimeManager或子容器是处理它的典型方法。

Unity的最新版本引入了Unity bootstrapper for ASP.NET MVC,其中包含一个新的内置生命周期管理器:PerRequestLifetimeManager

您可以在Developer's Guide to Dependency Injection Using Unity第3章Dependency Injection with Unity中阅读更多内容。