首页 新闻 会员 周边

ApplicationServices无法获取Scope的问题

0
[待解决问题]

使用AddScoped注册的的方法,无法通过IApplicationBuilder的ApplicationServices的GetService方法获取,提示“ Cannot resolve scoped service 'Blog.Quartz.Application.Service.IQuartzOptionService' from root provider”,但是我使用ApplicationServices.CreateScope().ServiceProvider.GetService时就可以了,百度了好久都没找到原因

灬丶的主页 灬丶 | 初学一级 | 园豆:2
提问于:2021-03-04 09:41

建议改进一下排版,支持 markdown 语法

dudu 3年前
< >
分享
所有回答(2)
0

建议提供“通过IApplicationBuilder的ApplicationServices的GetService方法获取”部分的代码

dudu | 园豆:30994 (高人七级) | 2021-03-04 11:08

我最后通过封装了一个这个方法,可以直接获取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

支持(0) 反对(0) 灬丶 | 园豆:2 (初学一级) | 2021-03-04 11:15

@灬丶: 这是一个反模式

支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2021-03-04 11:20

@dudu: 啥意思,不懂,请指教

支持(0) 反对(0) 灬丶 | 园豆:2 (初学一级) | 2021-03-04 11:20

@dudu: 我这里无法通过构造函数注入,所以就只能这样

支持(0) 反对(0) 灬丶 | 园豆:2 (初学一级) | 2021-03-04 11:21
0

你需要去了解下 scoped 类型service 的生命周期。
ServiceProvider root空间下 只有 Singleton 的service。

gt1987 | 园豆:1150 (小虾三级) | 2021-03-11 10:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册