asp.net-mvc – Unity PerRequestLifetimeManager在不同请求中重用对象

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – Unity PerRequestLifetimeManager在不同请求中重用对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我为我们的项目设置了Unity for dependency injection.项目本身是一个使用MVC和Web API的ASP.NET应用程序.

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

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

要在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 */);
    }
));

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

这里发生了什么?我是否缺少一些配置才能使其正常工作?或者这不应该像我期望的那样工作?

解决方法

问题是UnityDependencyResolver在多个请求中缓存已解析的项目.我不得不将其更改为UnityHierarchicalDependencyResolver,然后根据相关的LifetimeManager开始正确解析我的项目.当看起来即使使用TransientLifetimeManager时,它仍然会返回相同的实例,这个问题最初变得更加混乱.

我在一个不同的(但有些相关的)问题中找到了答案:using a Handler in Web API and having Unity resolve per request

所以我所做的就是改变

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

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

我所有的问题都解决了.

原文链接:https://www.f2er.com/aspnet/248824.html

猜你在找的asp.Net相关文章