如何使用服务定位器按服务类型解析服务?



我正在使用这样的ServiceProvider.GetService<T>()解析服务。但后来我发现解析作用域服务在调用方法ServiceProvider.GetService<T>()根提供程序中找不到说服务时出现运行时错误。然后我发现解决像这样创建范围的问题,

using (var scope = _serviceProvider.CreateScope())
{
return scope.ServiceProvider.GetService<T>();
}

我想创建一个通用函数。但问题是我不知道何时使用服务提供商范围,何时不使用服务提供商,因为我不知道服务生命周期类型(作用域/单例(。 如何创建此通用函数,以便在不知道生存期或解决生存期问题的情况下解析服务?

除非有理由不按预期注入服务,否则不应这样做。你可以看看这里 (https://learn.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-3.1(

此外,如果您在 ConfigureServices(..( 结束之前构建服务提供程序可能会导致非常细微的错误,非常难以跟踪。以下是有关该的更深入的信息 在 ConfigureServices(( 中调用 BuildServiceProvider(( 的成本和可能的副作用是什么

说了这么多,你应该在启动时的 ConfigureService(..( 方法中定义服务的生存期.cs如下所示

services.AddSingleton<ISingletonService, SingletonService>();
services.AddScoped<IScopedService, ScopedService>();

当你调用这个逻辑时

using (var scope = _serviceProvider.CreateScope())
{
return scope.ServiceProvider.GetService<T>();
}

服务提供程序本身使用配置服务上的代码处理服务生存期。

希望对您有所帮助!

相关内容

最新更新