gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:54:16 28 4
gpt4 key购买 nike

我已经为我们的项目设置了 Unity 以进行依赖注入(inject)。该项目本身是一个使用 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 */);
}
));

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

这里发生了什么?我是否缺少一些配置以使其正常工作?或者这不应该按照我期望的方式工作吗?

最佳答案

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

我所有的问题都解决了。

关于asp.net-mvc - Unity PerRequestLifetimeManager 在不同请求中重用对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27065538/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com