何时使用 PerThreadLifetimeManager?

2023-11-29

我按照下面链接的示例来设置 Unity 以与我的服务层一起使用。我的项目的设置与本文中的项目非常相似,我了解一切,除了到底为什么PerThreadLifetimeManager注册服务依赖项时使用。请记住,我还使用了也在我的服务层中使用的通用存储库和工作单元。大多数统一示例使用默认(瞬态)生命周期管理器,并且由于我的设置类似于下面的设置,我想知道为什么我应该使用PerThreadLifeimeManager?如果有什么改变的话,我正在为我当前的表示层使用 ASP.NET Web 表单项目。

container.RegisterType<ICatalogService, CatalogService>(
    new PerThreadLifetimeManager())

[asp.net MVC 3 中使用 EF 代码优先依赖注入的存储库模式][1] [1]:http://www.dotnetage.com/publishing/home/2011/07/05/6883/the-repository-pattern-with-ef-code-first-dependeny-injection-in-asp-net- mvc3.html


每个线程的生命周期是一种非常危险的生活方式,一般来说你应该not在您的应用程序中使用它,尤其是 Web 应用程序。

这种生活方式应该被认为是危险的,因为很难预测线程的实际寿命。当您使用以下命令创建并启动线程时new Thread().Start(),您将获得一个新的线程静态内存块,这意味着容器将为您创建一个新的每线程实例。当使用线程池启动线程时ThreadPool.QueueUserWorkItem但是,您可能会从池中获得一个现有线程。在 ASP.NET 中运行时也是如此。 ASP.NET 池化线程以提高性能。

这意味着线程几乎总是比 Web 请求更长寿。另一方面,ASP.NET 可以异步运行请求,这意味着 Web 请求可以在不同的线程中完成。当使用“每线程”生活方式时,这是一个问题。当然,当您开始使用 async/await 时,这种效果会被放大。

这是一个问题,因为您通常会调用Resolve<T>在请求开始时一次。这将加载完整的对象图,包括使用每线程生活方式注册的服务。当 ASP.NET 在不同的线程中完成请求时,这意味着已解析的对象图将移动到此新线程,包括所有按线程注册的实例。

由于这些实例被注册为每个线程,因此它们可能不适合在另一个线程中使用。它们几乎肯定不是线程安全的(否则它们将被注册为单例)。由于最初启动请求的第一个线程已经可以自由地接收新请求,因此您可能会遇到两个线程同时访问这些 Per Thread 实例的情况。这将导致难以诊断和发现的竞争条件和错误。

所以一般来说,使用 Per Thread 是一个坏主意。相反,使用具有明确范围的生活方式(隐式或显式定义的开始和结束)。大多数 DI 框架实现的 Per Web Request 生活方式通常是隐式范围的(您不必自己结束它)。

具体到你的问题

更糟糕的是,您引用的博客文章包含配置错误。这ICatalogService定义为每线程生活方式。然而,这项服务取决于IDALContext服务,定义为短暂的。由于引用了IDALContext实例作为私有字段存储在CatalogService,这意味着DALContext只要ICatalogService做。这是一个问题,因为IDALContext定义为短暂的并且可能不是线程安全的。

生活方式的一般规则

一般规则是让组件仅依赖于具有相同或更长生命周期的服务。因此瞬态可以依赖于单例,但反之则不然。

由于每线程注册的组件通常会存活很长时间,因此它通常只能安全地依赖于其他每线程或单例实例。由于 ASP.NET 可以将单个请求拆分为多个线程,因此在 ASP.NET 应用程序(MVC、Web 窗体,尤其是 Web API)上下文中使用 Per Thread 并不安全。

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

何时使用 PerThreadLifetimeManager? 的相关文章

  • Antlr 解析器运算符优先级

    考虑以下语法 我对运算符优先级有疑问 例如 res 2 a b有一个类似的解析树res 2 a b 我知道问题出在哪里 但我没有想到没有相互左递归的 漂亮 解决方案 你能帮我一点忙吗 该语法与自定义访问者一起使用 grammar Math
  • 带有 Maven Wrapper 的 Java 17 导致无法识别的 VM 选项“MaxPermSize=512m”

    I use OpenJDK 17 https jdk java net 17 使用 Maven Wrapper 3 8 2 从春季初始化 https start spring io Maven项目 JAR打包 Java 17 Spring
  • MySQL 查询计算上个月

    我想计算上个月的订单总额 我收到了从当前日期获取当月数据的查询 SELECT SUM goods total AS Total Amount FROM orders WHERE order placed date gt date sub c
  • 没有输入的 jQuery 日期选择器

    我有一个相当复杂的网络应用程序 我想向其中添加一些日期选择 UI 我遇到的问题是我无法从文档中弄清楚如何真正控制日期选择器的出现方式和时间 不涉及任何表单元素 不 我不会添加秘密表单字段 因此简单的开箱即用方法根本行不通 我希望有人可以提供
  • PrimeFaces 对话框参考父级

    我有一个 xhtml 页面 显示带有条目的数据表 我还有一个用于插入新条目的按钮 该按钮显示一个包含表单的对话框 插入表格用作
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • php 数组中出现意外的 json 输出结构

    我正在尝试转换动态数据 如何从 PHP 获取此 JSON JSON 122240cb 253c 4046 adcd ae81266709a6 item 0 3 这就是我所做的 但它不起作用 PHP json array 122240cb 2
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教
  • Amazon RDS for SQL Server 是否支持 SSIS?

    从谷歌搜索中读到一些相互矛盾的答案 不确定答案是是 否还是可能 我觉得读的时候已经很清楚了this http docs aws amazon com AmazonRDS latest UserGuide CHAP SQLServer htm
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使
  • 如何修复:“无法解析类型 java.lang.CharSequence。它是从所需的 .class 文件间接引用的”消息? [复制]

    这个问题在这里已经有答案了 我正在尝试使用这个字符串 amountStr amountStr replace replace replace 但我收到一条错误消息 我知道我收到的错误消息是因为我刚刚发布的字符串已过时 所以我想知道该字符串的
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前
  • 禁用允许文本选择的

    残疾人可以吗
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording
  • 探查器模板可以迁移到较新版本的 SQL Profiler 吗?

    是否可以将 Profiler 模板迁移到较新版本的 SQL Server 就我而言 我想将 SQL 2008 模板带到 2012 年 我尝试过 1 直接文件复制和 2 导出 导入 在这两种情况下 旧模板都会运行 但无法修改 修改后会出现以下

随机推荐

  • php: echo ('x' == 0) 打印 1(真)。它是否正确?

    我和我的朋友在调试应用程序时发现了这个 此代码打印 1 因此 x 等于 0 这是正确的 有人可以解释为什么会这样吗 我想可能是我不明白 php 规则中的某些内容 或者可能是一个错误 谢谢 使用 类型杂耍 将字符串转换为数字 这显示在文档 t
  • Jupyter笔记本,将单元从一个笔记本移动到一个新笔记本中

    是否可以将 n 个单元从一台笔记本移动到另一台新笔记本 以编程方式将 n 个单元从一台笔记本移动到新笔记本 是的 您可以使用nbformat取出一个笔记本 并将新笔记本的内容限制为原始笔记本的 n 个单元格的块 nbformat 包允许您以
  • 调用 C# COM 对象

    好的 我创建了一个 c dll 将其所有接口和方法全部设为 ComVisible true 使用 gacutil 将其添加到 GAC 然后使用 regasm 注册它并创建类型库 tlb 文件 现在我有另一个 c 项目 我想调用该 com 对
  • 如何从 Power Query 中的上一行获取列值?

    我想从前一行获取一个值 我按照中的建议尝试了以下代码这个帖子 Table AddColumn Added index custom column each Index 1 column name 但它会抛出这个错误 Cannot use f
  • Python:使用 webbrowser-control 更改网络浏览器的 url

    好的 我知道如果你想使用 python 打开特定的 url 你可以运行 import webbrowser webbrowser open buinvent com 但是 如果您想在 Web 浏览器中将其更改为不同的 url 而不在 Web
  • 在我的班级中实现 Thread Android?

    我想知道如何在此类中实现线程以使其免受ANR 应用程序无响应 问题的影响 public class myClass private static String LOG TAG Root class getName public boolea
  • 奇怪的 JavaScript 习惯用法 - “/xyz/.test(function(){xyz;})” 是做什么的?

    John Resig 写了一个漂亮的类函数 时髦 我试图弄清楚发生了什么事 并且几乎所有事情都弄清楚了 除了一行 fnTest xyz test function xyz b super b 有几件事立即跳入我的脑海 首先xyz从未被初始化
  • 转换后的图像不清楚。 .wmf 转 png

    我正在尝试使用 c net 将 wmf 图像文件转换为 png 格式 但是 保存的图像不清楚 my code Metafile img new Metafile test wmf MetafileHeader header img GetM
  • VueJS从父组件访问子组件的数据

    我正在使用webpack 的 vue cli 脚手架 我的 Vue 组件结构 层次结构当前如下所示 App PDF Template 背景 动态模板图像 静态模板图像 Markdown 在应用程序级别 我想要一个 vuejs 组件方法 可以
  • 在Python中按(n个)块迭代迭代器?

    你能想出一种好方法 也许使用 itertools 将迭代器分割成给定大小的块吗 所以l 1 2 3 4 5 6 7 with chunks l 3 成为迭代器 1 2 3 4 5 6 7 我可以想到一个小程序来做到这一点 但也许不是 ite
  • Lein Clojure 1.3 与 Clojure 1.2.1

    我承认这个问题的措辞有点糟糕 请让我知道我应该运行哪些命令来提供更多信息 我会提供它 背景 我使用 Clojure 已有约 1 年了 主要只是通过clojure repl 现在 我开始使用 Lein 然而 leon 不喜欢我的一些代码 这是
  • 如何使用php检索特定文件夹中的所有文件名

    比如说 在我的网络服务器中有一个名为 upload files 的文件夹 然后我的 php 页面之一应该获取该文件夹中的所有文件名 我已经用谷歌搜索过 但到目前为止返回的文件名只是用户浏览的页面 谢谢 有很多方法可以检索文件夹内容 例如gl
  • CodeIgniter - 使用一个输入上传多个文件

    我正在尝试上传几个文件立即从1个输入
  • 如何创建一个无论字符序列如何都匹配的正则表达式?

    假设我要求用户输入所提供的某些单词 他 只会将其输入到将被验证的文本框中不管我已经寻找答案几个小时了 但我被困住了 例如应输入的单词是 foo bar green 即使订单是 我仍然可以匹配它绿富酒吧 or 绿色Foo酒吧 我非常了解正则表
  • 如何在 EF Core 2.1.0 中设置管理员用户?

    我有一个使用 EF Core 2 1 0 的 ASP NET Core 2 1 0 应用程序 如何使用管理员用户播种数据库并赋予他 她管理员角色 我找不到任何关于此的文档 As user cannot be seeded in a norm
  • Android - ListView:复选框未保持选中状态

    我有一个列表视图 大约有 200 个项目 我为复选框实现了一个自定义 ArrayAdapter 我使用 SparseBooleanArray 来存储框的值 所有这些工作正常 但我似乎无法以图形方式更新复选框的检查 如果用户单击 则该框被选中
  • 链接两个 D3 图

    我正在尝试链接两个 D3 图 以便选择右侧直方图的一部分 导致某个散点图显示在左侧 This是我的尝试 我当前的问题是为什么正确的图没有渲染 我认为这可以追溯到如何在 d3 中创建和引用多个 SVG 标签 D3 有针对这种情况的 SVG 控
  • 使用包将 Python 类拆分为多个模块

    我在 python 中编写了一些代码作为一个类 但现在我正在尝试将其作为包分发 但我在弄清楚不同的部分应该如何组合在一起时遇到了一些麻烦 因此 当我最初编写代码时 我有一个包含一些函数的类 其中包括 init 功能 我现在已将每个函数拆分为
  • 从 XSLT 2 中元素值的语义层次结构创建父子元素

    我在 XML 内容中有一系列 P 标记 它们在其初始值内具有语义层次结构 但是 P 标记是线性的 寻找 XSLT 2 转换 语义层次如下 1 a I A 正则表达式序列如下
  • 何时使用 PerThreadLifetimeManager?

    我按照下面链接的示例来设置 Unity 以与我的服务层一起使用 我的项目的设置与本文中的项目非常相似 我了解一切 除了到底为什么PerThreadLifetimeManager注册服务依赖项时使用 请记住 我还使用了也在我的服务层中使用的通