清理 ServiceCollection 和 ServiceProvider 的“Pre”实例的正确方法?

问题描述 投票:0回答:2

我正在我的应用程序中实现自定义配置提供程序

在该提供程序中,我必须进行 REST API 调用。 该调用需要有效的 OAuth 2 令牌才能成功。 为了获得该令牌,我需要一个半复杂的类依赖关系树。

对于我的应用程序的其余部分,我只是使用依赖项注入来获取所需的实例。 但在设置依赖注入之前,会调用自定义配置提供程序。

我考虑过制作一个依赖注入的“Pre”实例。 像这样:

IServiceCollection services = new ServiceCollection();
// Setup the DI here
IServiceProvider serviceProvider = services.BuildServiceProvider();
var myTokenGenerator = serviceProvider.GetService<IMyTokenGenerator>();

但我读到,当你再制作一个

ServiceCollection
时,可能会导致问题。 我想知道如何避免这些问题。

如何正确清理

ServiceCollection
ServiceProvider
的“pre-DI”实例?

(注意:两者似乎都没有实现 IDisposable。)

asp.net-core asp.net-core-3.1 service-provider servicecollection
2个回答
0
投票

嗯,我不明白你为什么要这样做。 我可能会完全构建 Serviceprovider。

为了避免检索到的服务相互影响,我将使用嵌套容器/范围,这意味着如果您检索相同的服务,每个容器/范围都会获得不同的实例。

希望我明白你想要实现的目标。 看 .NET Core IServiceScopeFactory.CreateScope() 与 IServiceProvider.CreateScope() 扩展


0
投票

死而复生!为了节省其他人我刚刚花在阅读上的时间,这里有一些可能对您有用的方法:

  1. 使用 2 个范围,一个用于“pre”,一个用于“main”。这很优雅,但如果您需要应用程序的另一个方面的范围(例如 ASP.NET 将它们映射到请求),则可能不太适合。如果您愿意有一个特殊情况范围(用于“pre”),那么仍然可行。

  2. “预”工作完成后,对 ServiceCollection 调用 .Clear,然后添加“主要”服务集。除非集合设置为只读,否则应该可以工作。 ServiceCollection 的源代码(8.0 仅 157 行)

© www.soinside.com 2019 - 2024. All rights reserved.