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

2023-11-21

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

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

为了能够使用PerRequestLifetimeManager,我添加了对 nuget 包的引用ASP.NET MVC 的 Unity 引导程序 and ASP.NET Web API 的 Unity 引导程序.

为了在 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,它仍然会返回相同的实例。

我在另一个(但有些相关)问题中找到了答案:在 Web API 中使用处理程序并让 Unity 解析每个请求

所以我所做的就是改变

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

to

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

我所有的问题都解决了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity PerRequestLifetimeManager 在不同请求中重用对象 的相关文章

随机推荐

  • 如何拦截网络请求

    有没有类似 Chromium 的东西chrome webRequestSafari 扩展 我浏览了他们的文档here 我能找到的最接近的东西是SafariBeforeNavigateEvent 这将阻止新页面加载 但仍会将请求发送到服务器
  • python-C++ 扩展可以获取 C++ 对象并调用其成员函数吗?

    我正在编写一个 python C 应用程序 它将从 python 调用 C 扩展中的方法 假设我的 C 有一个类 class A private int i public A int i i i int get i return i A a
  • 如何使用 Google 地方信息获取地名数组?

    我正在尝试访问 Google 地方信息以返回围绕纬度和经度的 50 个餐厅名称的数组 但在提出请求时遇到了困难 我已经有了确定用户纬度和经度的代码 并且我已经从 Google 获得了 API 密钥 我只是不知道如何通过 URL 发出请求 而
  • 如何访问作为 RMarkdown 文档中参数传递的文件中的数据?

    遵循 RMarkdown 的最后一个示例参数化报告页面 我正在尝试使用Shiny界面选择我的输入文件 其中包含以下代码YAML标头 params data input file label Input dataset value myDat
  • 模拟 DbContext.Set()?

    我们首先使用 EF 代码 并为我们的销售数据库提供数据上下文 此外 我们还有一个类位于数据上下文之上并执行一些基本的 CRUD 操作 例如 我们有以下函数 public static T Create
  • cv2.VideoCapture.read() 在 time.sleep() 之后获取旧帧

    我尝试用 Python 捕捉 立体 图像opencv和两个摄像头 因此每 5 秒应保存一张图像 但这里的问题是保存了旧框架 缩小后的代码如下 cap cv2 VideoCapture 0 for i in range 20 time sle
  • python导入站点失败

    当我执行python脚本时 出现这个问题 import site failed use v for traceback 所以我再次尝试使用 v 选项 我可以得到这些消息 import site failed traceback Traceb
  • Webpack 2:如何排除除以下之外的所有node_modules

    我需要让 babel 运行 node modules identicons 但是我仍然想排除所有其他包 原因是标识符包正在使用模板字符串并在运行时中断 webpack p 有问题的字符串 node modules identicons in
  • Go并发和通道混乱

    我是 Go 新手 在理解并发和通道方面遇到问题 package main import fmt func display msg string c chan bool fmt Println display first message ms
  • 如何为 Karate API 中的所有功能文件设置全局标头

    我需要发布一个请求来获取授权令牌并将其包含在所有后续测试请求的标头中 该令牌每次都会更改 但只要我继续发送请求 它就对整个测试会话有效 在每个功能文件中 我可以调用另一个功能文件来获取此令牌 但我不想对每个功能文件都这样做 我只想在测试开始
  • Visual Studio 不断要求将项目文件另存为

    我正在使用 VS 2010 最近我移动了一些文件并更改了路径等 该解决方案仍然可以正确编译 并且所有文件都可以毫无错误地加载 编译 但是几乎每次我在更改后进行编译时 它都会显示 另存为 对话框 并要求我保存其中一个项目 如果我尝试这样做 给
  • 使用pycharm调试,如何单步进入项目,而不进入django库

    想想这个场景 我调试 Django 项目并单步执行代码 进出 调试器有时会进入 Django 库或其他外部库 有谁知道如何防止调试器输入外部代码 或者至少迈出 大 一步让调试器返回到项目代码 有谁知道如何防止调试器输入外部代码 是的 德米特
  • Restangular 是否支持 withCredentials 选项和 cors 请求的其他选项?

    我正在谷歌搜索 但没有找到任何线索 矩形是否支持凭证选项以及 cors 请求的其他选项 我的意思是我可以在 cors 调用中使用它而没有任何问题吗 你能帮我吗 是的 它确实 您可以通过使用来设置它们setDefaultHttpFields
  • 不同 Logback 附加程序的特定于包的日志记录级别

    我有这个简单的 Logback 配置文件 其中包含两个附加程序和一些基于包名称的自定义日志记录级别
  • 点符号与 $elemMatch

    我有一个 unitScores 集合 其中每个文档都有一个 id 和一个文档数组 如下所示 id ObjectId 52134edd5b1c2bb503000001 scores userId ObjectId 5212bf3869bf35
  • PHPStorm 中是否可以实现 Ruby 语法高亮显示?

    I found this但老实说不确定如何安装它或它是否适用 谢谢 您链接的 Ruby 插件仅为 IntelliJ IDEA Ultimate 设计 它不适用于 PhpStorm 看这个答案更多细节 但是 可以使用 PhpStorm 中的
  • 在循环之前或循环中声明变量之间的区别?

    我一直想知道 一般来说 在循环之前声明一个一次性变量 而不是在循环内重复声明 是否会产生任何 性能 差异 A 完全没有意义 Java 中的示例 a 循环前声明 double intermediateResult for int i 0 i
  • 确定 GAM 平滑对象的导数

    我有一个非常简单的时间序列数据集 由单个变量的年平均值 AVERAGE 组成 我希望研究时间序列 趋势 分量的变化率 一阶导数 和加速度 二阶导数 以及相关的标准误差 我使用 MGCV 的 GAM 和 PREDICT 函数获得了 趋势 如下
  • 核心数据内存使用和内存警告

    我有这个问题 我在核心数据中有一个图像数据库 我获取所有图像 大约 80MB 并放入 NSMutableArray 中 对象被正确错误 NSArray fetchResults self managedObjectContext execu
  • Unity PerRequestLifetimeManager 在不同请求中重用对象

    我已经为我们的项目设置了 Unity 的依赖注入 该项目本身是一个同时使用 MVC 和 Web API 的 ASP NET 应用程序 对于数据库上下文 我正在使用PerRequestLifetimeManager 这样做是为了使业务逻辑的不