2014-11-21 22 views
7

我为我们的项目设置了用于依赖项注入的Unity。该项目本身是一个同时使用MVC和Web API的ASP.NET应用程序。Unity PerRequestLifetimeManager在不同请求中重复使用对象

对于数据库上下文,我使用的是PerRequestLifetimeManager。这样做是为了使业务逻辑的不同位使用相同的上下文(并因此是相同的事务)。

为了能够使用到的NuGet包PerRequestLifetimeManager,我已经添加引用团结引导程序的ASP.NET MVC团结引导程序进行的ASP.NET Web API

为配合使用的Web API这一辈子经理,以下行已添加到启动代码:

Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule)); 

的统一容器设置两个MVC和Web API:

var container = BuildUnityContainer(); 
GlobalConfiguration.Configuration.DependencyResolver = new Microsoft.Practices.Unity.WebApi.UnityDependencyResolver(container); 
System.Web.Mvc.DependencyResolver.SetResolver(new Microsoft.Practices.Unity.Mvc.UnityDependencyResolver(container)); 

在建设团结容器,将数据库上下文设置为可通过以下方式每个请求解析:

container.RegisterType<IDataContext>(new PerRequestLifetimeManager(), 
    new InjectionFactory(c => 
    { 
     // Some code 
     return new DataContext(/* params */); 
    } 
)); 

但是,这个代码似乎没有为每个请求提供新的DataContext。它在单个请求中给予我不同地方的相同上下文(这很好)。然而,随后的(web api)请求会被赋予相同的DataContext实例,我期望为每个新请求创建一个新实例。我也希望DataContext在请求完成后(类实现IDisposable)被正确处置。

这是怎么回事?我是否缺少一些配置以使其正常工作?或者这不应该像我期望的那样工作?

+0

它可能会缓存InjectionFactory调用。你可以尝试没有它?我想象的问题是你想要有不同的参数。 – 2014-11-21 16:12:37

回答

11

问题原来是因为UnityDependencyResolver缓存了几个请求的解决项目。我不得不将其更改为UnityHierarchicalDependencyResolver,然后它开始根据关联的LifetimeManager正确解析我的物品。当问题出现时,即使使用TransientLifetimeManager,它仍会返回相同的实例,最初问题变得更加混乱。

我发现了一个不同的(但有点关系)问题的答案:using a Handler in Web API and having Unity resolve per request

所以我所做的就是要

GlobalConfiguration.Configuration.DependencyResolver = new Microsoft.Practices.Unity.WebApi.UnityHierarchicalDependencyResolver(container); 

变化

GlobalConfiguration.Configuration.DependencyResolver = new Microsoft.Practices.Unity.WebApi.UnityDependencyResolver(container); 

和我所有的问题都解决了。

相关问题