2014-11-21 19 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); 

和我所有的問題都解決了。

相關問題