Unity PerRequestLifetimeManager在不同请求中重用对象

时间:2014-11-21 16:05:26

标签: asp.net-mvc asp.net-web-api unity-container

我为我们的项目设置了Unity for dependency injection。该项目本身是一个使用MVC和Web API的ASP.NET应用程序。

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

为了能够使用PerRequestLifetimeManager,我添加了对nuget包的引用用于ASP.NET MVC的Unity引导程序和用于ASP.NET的 Unity引导程序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 */);
    }
));

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

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

1 个答案:

答案 0 :(得分:12)

问题原来是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);

我所有的问题都解决了。

相关问题