Asp.net mvc Unity PerRequestLifetimeManager在不同请求中重复使用对象
我已经为我们的项目建立了依赖注入的Unity。该项目本身是一个使用MVC和Web API的ASP.NET应用程序 对于数据库上下文,我使用的是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
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);