dbcontext的.net core 2.0范围问题

时间:2018-06-20 18:11:55

标签: c# asp.net-mvc asp.net-core-2.0

在我的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

有人有什么想法我还能做什么吗?

2 个答案:

答案 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等。这些将在处置范围时处置。