ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-09-07 01:32:42  阅读:197  来源: 互联网

标签:服务 请求 作用域 应用程序 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#,单例,范围
来源: https://www.cnblogs.com/amboke/p/16663883.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有