asp.net-core - 如何使用 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)。我如何创建这个通用函数来解决服务而不知道生命周期或解决生命周期问题?
解决方案
除非有理由不按预期注入服务,否则您不应该这样做。你可以看看这里(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 上的代码处理服务生命周期。
希望对你有帮助!
推荐阅读
- c++ - 堆栈上分配的内存在释放时是否会被清除?
- graphql - 具有某些参数组合的graphql查询
- python - 如何在 Pygame 中拥有无限的 FPS 并仍然控制程序的 FPS?
- excel - Excel 动态行条件格式
- reactjs - TypeError: (0 , _system.css) 不是 Jest 和 Material UI 的函数错误
- javascript - 我可以在 streamlit Web 应用程序中显示自定义 javascript
- python - 如何在python中将数字列表拆分为电话号码?
- mysql - nodemon 错误 - 在不同的目录中打开?它正在另一个目录中查找模块
- linux - Bash 中的 FFMPEG - 为“电影”过滤器指定的输入过多
- android - 如何同时做填充和大纲TextInputLayout android?