我正在使用这样的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>();
}
服务提供程序本身使用配置服务上的代码处理服务生存期。
希望对您有所帮助!