首页 > 解决方案 > 如何使用 ServiceLocator 按服务类型解析服务?

问题描述

我正在使用这样的解决服务ServiceProvider.GetService<T>()。但后来我发现 Resolving Scoped Services 在调用方法ServiceProvider.GetService<T>()Saying service not found in root provider期间出现运行时错误。然后我发现要解决这样的创建范围,

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

我想创建一个通用函数。但问题是我不知道何时使用服务提供者范围以及何时不使用服务提供者,因为我不知道服务生命周期类型(Scoped/Singleton)。我如何创建这个通用函数来解决服务而不知道生命周期或解决生命周期问题?

标签: asp.net-core.net-coredependency-injectioninversion-of-controlioc-container

解决方案


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

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

说了这么多,你应该在 Startup.cs 的 ConfigureService(..) 方法中定义服务的生命周期,如下所示

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

当你调用这个逻辑时

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

ServiceProvider 本身使用 ConfigureServices 上的代码处理服务生命周期。

希望对你有帮助!


推荐阅读