使用AddScoped注册的的方法,无法通过IApplicationBuilder的ApplicationServices的GetService方法获取,提示“ Cannot resolve scoped service 'Blog.Quartz.Application.Service.IQuartzOptionService' from root provider”,但是我使用ApplicationServices.CreateScope().ServiceProvider.GetService时就可以了,百度了好久都没找到原因
建议提供“通过IApplicationBuilder的ApplicationServices的GetService方法获取”部分的代码
我最后通过封装了一个这个方法,可以直接获取Scope
public class ServiceLocator
{
private static Func<IServiceCollection, IServiceProvider> _buildServiceProvider;
private static IServiceCollection _ServiceDescriptors;
public static void Init(IServiceCollection serviceDescriptors, Func<IServiceCollection, IServiceProvider> buildServiceProvider)
{
_ServiceDescriptors = serviceDescriptors;
_buildServiceProvider = buildServiceProvider;
}
public static T Get<T>() where T:class
{
return _buildServiceProvider(_ServiceDescriptors).GetService<T>();
}
}
ServiceLocator.Init(serviceDescriptors, s => s.BuildServiceProvider());
我本来想直接把 _buildServiceProvider(_ServiceDescriptors)返回的用静态的保存起来,但是这样 ServiceLocator.Get<IQuartzOptionRepository>(),我觉得是因为静态的对象导致获取到的都是同一个EF的dbcontext
@灬丶: 这是一个反模式
@dudu: 啥意思,不懂,请指教
@dudu: 我这里无法通过构造函数注入,所以就只能这样
你需要去了解下 scoped 类型service 的生命周期。
ServiceProvider root空间下 只有 Singleton 的service。
建议改进一下排版,支持 markdown 语法
– dudu 3年前