如何在 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

posted @ 2022-09-07 00:51  哈哈哈来了啊啊啊  阅读(208)  评论(0编辑  收藏  举报