首页 > 编程语言 >如何在 C# 中的单例中使用作用域服务

如何在 C# 中的单例中使用作用域服务

时间:2022-09-07 01:00:55浏览次数:164  
标签:服务 请求 作用域 应用程序 C# 单例 范围

如何在 C# 中的单例中使用作用域服务

简要讨论这个过程

Photo by 奥罗网代理 on 不飞溅

这听起来不干净,并且缺少作用域的目的,对吧?通常,当您拥有一个作用域服务时,它只能用于同一作用域的其他作用域服务。范围是一个相互关联的请求的封闭环境。例如,当您向 API 发出请求时,该 API 可能会在封闭范围内处理您的请求,即实例化仅在此范围内使用的服务。

与此相反,单例服务在每个应用程序生命周期托管一次,并且仅在应用程序结束时被释放。自然,您不能在单例服务中引用封闭范围的服务,而且在大多数情况下,您也不应该这样做。

但是,在极少数情况下,托管一个使用范围服务的单例可能有意义。例如,在我的最新项目中,我主持了一个 功能应用程序 天蓝色 ,其中每个请求产生一个范围。此函数应用程序还使用定时触发器和后端触发器,它们将具有应用程序的范围。

现在,每次后端请求进入时,应用程序都会实例化一个新范围,其中包含新的 HttpClients、BlobClients 等。当然,有很多后端请求……然后应用程序会创建数十万个客户端,这些客户端也是可重用的。但是,使它们成为单例是不可能的,因为必须确定身份验证服务的范围。

如果您从未使用过依赖注入,请查看 本文档 .

解决方案是简单地手动创建一个作用域,它与单例具有相同的生命周期。

IServiceScopeFactory

负责创建新范围的服务称为: IServiceScopeFactory .界面可以在 Microsoft.Extensions.DependencyInjection.Abstractions 图书馆。您可以简单地将这个接口放在构造函数中,并有权创建自己的范围。这是代码:

Manual implementation with IServiceScopeFactory

现在您只需将此服务作为 Singleton 添加到 DependencyInjection 容器中,就可以开始了!

如果您现在想知道是否需要重写所有代码以便可以在单例中使用作用域服务,请不要担心,我已经开发了一个替代方案:

AddScopedSingleton() 扩展方法

正如您将服务添加到 IServiceCollection ,我想完全像那样添加我的 Scoped Singleton 服务,而无需更改服务本身。这就是我创建以下方法的原因:

Extension Methods AddScopedSingleton

如您所见,该方法在技术上将单例实例添加到 IServiceCollection ,但是,服务本身是在新范围内创建的。

在应用程序范围的情况下,这些扩展现在使我的 Functions 应用程序在每个应用程序生命周期中只托管每种类型的服务。请记住,您不能使用此方法来包装所有范围内的服务。对于大多数对 API 的请求,范围通常是必需的,并且只有一小部分可能能够在单例中运行。

谢谢阅读!请继续关注更多。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/20768/49360700

标签:服务,请求,作用域,应用程序,C#,单例,范围
From: https://www.cnblogs.com/amboke/p/16663883.html

相关文章

  • 第一章、react高级
    目录一、邂逅react开发和初体验1、简介2、helloreact案例一、邂逅react开发和初体验1、简介*react是什么?-用于构建用户界面的javascript库*常见的javascript......
  • 了解 ES6 中 var、let 和 const 的范围
    了解ES6中var、let和const的范围了解ES6中的全局、本地和块级作用域发病前ES2015(ES6),这曾是statement是在JavaScript中声明变量的唯一选项。然而,由于......
  • 使用 useMemo、useCallback 和 React.memo 优化 React Render
    使用useMemo、useCallback和React.memo优化ReactRenderPhotobySusanQYinon不飞溅维护有这么多贡献者的代码比我更难,你不同意吗?这是2022年我第一次与在......
  • C#/.NET/.NET Core优秀项目框架推荐
    思维导航:前言Blog.CoreAspNetCoreWeiXinMPSDKABPFrameworkUtilsiteserver/cmsOSharpVue.NetCoreOpenAuth.Netant-design-blazorNetModularpaymentFurion......
  • 基于TextCNN的文本情感分类
    TextCNN在文本处理中使用卷积神经网络:将文本序列当作一维图像一维卷积->基于互相关运算的二维卷积的特例:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下......
  • AtCoder Regular Contest 147
    ProblemA题目大意:由N个正整数组成的序列,我们可以从中取出任意长短序列进行如下操作:序列中(最大值maxn%最小值minn=A),如果A为0则删除maxn,否则用A替换,询问要使得整个序......
  • 社交登录—为何用code换取access_token
    用账号密码访问认证服务器获取认证得到code 为什么不直接给token再用token+clientId密钥做头,换取token可能因为认证服务器  需要clientId等做权限---密钥......
  • 如何设置您的第一个 Tailwind CSS 项目
    如何设置您的第一个TailwindCSS项目与任何其他CSS框架不同,TailwindCSS没有固执己见,它允许您为任何项目创建组件和设计元素。它不是唯一实用程序优先的CSS框架,但......
  • Stylify:实用程序优先的 CSS 库来替换 Tailwind
    Stylify:实用程序优先的CSS库来替换Tailwindhttps://stylifycss.com/为什么创建Stylify的作者会引起你的共鸣一个项目使用Bootstrap,第二个项目使用Tailwind和......
  • 【云原生】Helm 常用命令(chart 安装、升级、回滚、卸载等操作)
    目录一、概述二、Helm仓库(helmrepo)1)添加chart仓库2)列出已添加的仓库3)从chart仓库中更新本地可用chart的信息4)删除一个或多个仓库三、创建chart(helmcreate)四、chart包安......