Asp.net mvc Unity PerRequestLifetimeManager在不同请求中重复使用对象

Asp.net mvc Unity PerRequestLifetimeManager在不同请求中重复使用对象,asp.net-mvc,asp.net-web-api,unity-container,Asp.net Mvc,Asp.net Web Api,Unity Container,我已经为我们的项目建立了依赖注入的Unity。该项目本身是一个使用MVC和Web API的ASP.NET应用程序 对于数据库上下文,我使用的是PerRequestLifetimeManager。这样做是为了使业务逻辑的不同部分使用相同的上下文(从而使用相同的事务) 为了能够使用PerRequestLifetimeManager,我添加了对nuget软件包Unity bootstrapper for ASP.NET MVC和Unity bootstrapper for ASP.NET Web AP

我已经为我们的项目建立了依赖注入的Unity。该项目本身是一个使用MVC和Web API的ASP.NET应用程序

对于数据库上下文,我使用的是
PerRequestLifetimeManager
。这样做是为了使业务逻辑的不同部分使用相同的上下文(从而使用相同的事务)

为了能够使用
PerRequestLifetimeManager
,我添加了对nuget软件包Unity bootstrapper for ASP.NET MVC和Unity bootstrapper for ASP.NET Web API的引用

为了在Web API中使用此生存期管理器,启动代码中添加了以下行:

Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));
Unity容器是为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));
在构建Unity容器时,将数据库上下文设置为按以下方式解析每个请求:

container.RegisterType<IDataContext>(new PerRequestLifetimeManager(),
    new InjectionFactory(c =>
    {
        // Some code
        return new DataContext(/* params */);
    }
));
container.RegisterType(新PerRequestLifetimeManager(),
新注射工厂(c=>
{
//一些代码
返回新的数据上下文(/*params*/);
}
));
然而,这段代码似乎并没有为每个请求提供新的
DataContext
。它在一个请求中的不同位置为我提供了相同的上下文(这很好)。但是,随后的(web api)请求被赋予了相同的
DataContext
实例,我希望在该实例中为每个新请求创建一个新的实例。我还希望
DataContext
在请求完成后得到正确处理(类实现了
IDisposable


这是怎么回事?我是否缺少一点使其正常工作的配置?或者这不是我期望的工作方式吗?

问题是
unitydependencysolver
在多个请求上缓存已解析的项。我不得不将其更改为
UnityHierarchicalDependencyResolver
,然后它开始根据关联的
LifetimeManager
正确解析我的项目。问题最初变得更加令人困惑,因为即使使用
TransientLifetimeManager
,它仍然会返回相同的实例

我在一个不同(但有些关联)的问题中找到了答案:

所以我所做的就是改变

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


我所有的问题都解决了。

它可能会缓存InjectionFactory调用。你能不用它试试吗?我想问题是你想要有不同的参数。有什么根本原因吗?
GlobalConfiguration.Configuration.DependencyResolver = new Microsoft.Practices.Unity.WebApi.UnityHierarchicalDependencyResolver(container);