在我的Services Collection中的.Net core 1.0和1.1中,我拥有:
services.AddDbContext<VisualJobsDbContext>();
...
...
services.AddScoped<IRecruiterRepository, RecruiterRepository>();
services.AddSingleton<IAccountRepository, AccountRepository>();
这似乎有效。现在,我进入了.net core 2.0,它已停止工作:
我已将以上内容更改为:
services.AddDbContext<VisualJobsDbContext>(ServiceLifetime.Scoped);
...
...
services.AddScoped<IRecruiterRepository, RecruiterRepository>();
services.AddScoped<IAccountRepository, AccountRepository>();
我仍然挥舞着以下错误:
处理请求时发生未处理的异常。 InvalidOperationException:无法使用作用域服务 Singleton中的FindaJobRepository.Interfaces.IAccountRepository FindaJobServices.Interfaces.IAccountService
有人有什么想法我还能做什么吗?
答案 0 :(得分:1)
IAccountService
是作为单例添加的,不能依赖具有较短生存期的服务。 IAccountRepository
是作用域服务。
可能您有一个类似这样的构造函数:
public IAccountService(IAccountRepository accountRepository) {
}
答案 1 :(得分:0)
不知道它是如何工作的,但是本质上您的问题是您试图将范围服务注入到一个单例中,这是基于错误的AccountService
。
简而言之,如果您需要使用范围服务,则必须将它们注入的类也进行范围设置。如果您需要将生存期设为单身,那么唯一的选择是使用服务定位器反模式,而在其中注入IServiceProvider
,然后围绕操作创建作用域:
using (var scope = _serviceProvider.CreateScope())
{
var context = scope.GetRequiredService<MyDbContext>();
// do something with context
}
重要的是,不要将您从范围中检索到的实例保存到单例类上的ivars,statics等。这些将在处置范围时处置。