使用InjectionFactory注入DbContext,创建实例的生命周期

时间:2014-04-23 13:06:19

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

我有一个使用Unity作为DI框架的ASP.NET MVC5项目。

请考虑以下代码:

container.RegisterType<ApplicationDbContext>(
    new InjectionFactory(c => new ApplicationDbContext()));

由于我的存储库使用相同的DbContext,将相同的实例传递给所有这些实例是切实可行的。但是,该站点的每个访问者都应该有一个单独的上下文实例,而不是在一个大的&#34;站点范围内工作&#34;实例。我想这会减少仅为当前请求设置实例生命周期的可能性。

由于UnityConfig.RegisterComponents()Application_Start()方法中,我猜它只会为整个应用程序创建一个实例。 在这种情况下,最佳做法是什么?我考虑过以下几点:

  1. 为DbContext创建我自己的工厂,该工厂返回一个单例,并将此工厂注入我的存储库
  2. UnityConfig.RegisterComponents()移至Application_BeginRequest()
  3. 我试图在微软的网站上搜索InjectionFactory,运气不大(http://msdn.microsoft.com/en-us/library/microsoft.practices.unity.injectionfactory%28v=pandp.51%29.aspx

    在这种情况下,我应该遵循什么最佳做法?我不想过度设计它,最简单的工作方案是什么?

3 个答案:

答案 0 :(得分:1)

我不是网络开发人员,但通过阅读依赖注入Unity一书,他们确实提到了一个可用于单个HTTP请求的特殊生命周期管理器 - PerRequestLifetimeManager

也许这可以满足您的需求?

答案 1 :(得分:1)

删除工厂并替换为:

container.RegisterType<ApplicationDbContext>(new HierarchicalLifetimeManager());

这将导致每个请求都有一个ApplicationDbContext实例,并且还会在请求结束时调用处理上下文。

答案 2 :(得分:-2)