无法在存储库中注入DbContext

时间:2019-03-27 09:01:11

标签: c# asp.net-core dependency-injection dbcontext

我尝试为新的ASP.NET Core网站设置DI,并且我有以下代码:

public void ConfigureServices(IServiceCollection services)
{
    services
        .AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    // Get the configuration from the app settings.
    var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json")
        .Build();

    // Get app settings to configure things accordingly.
    var appSettings = Configuration.GetSection("AppSettings");
    var settings = new AppSettings();
    appSettings.Bind(settings);

    services
        .AddOptions()
        .Configure<AppSettings>(appSettings)
        .AddSingleton<IConfigurationRoot>(config)
        .AddDbContext<MyDbContext>(builder =>
        {
            builder.UseSqlServer(config.GetConnectionString("myConn"));
        }, ServiceLifetime.Transient, ServiceLifetime.Transient);

    services.AddSingleton<ILoadTestCleanUpServiceRepository, LoadTestCleanUpServiceRepository>();
        ...

现在,LoadTestCleanUpServiceRepository取决于MyDbContext

public class LoadTestCleanUpServiceRepository : ILoadTestCleanUpServiceRepository
{
    private readonly MyDbContext _dbContext;

    public LoadTestCleanUpServiceRepository(MyDbContext dbContext)
    {
        _dbContext = dbContext;
    }
    ...

..并且数据库上下文是这样的:

public class MyDbContext : DbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> ctxOptions) : base(ctxOptions)
    {
    }
}

运行应用程序时,出现此错误:

  

InvalidOperationException:无法解析类型的服务   尝试尝试“ MyCode.Infrastructure.Common.MyDbContext”   启用   “ MyCode.Infrastructure.LoadTestCleanUpService.LoadTestCleanUpServiceRepository”。

我尝试更改ServiceLifetime选项并添加以下额外代码:

services.AddTransient<MyDbContext>(sp => new MyDbContext(config));

...但是似乎没有任何帮助,我不明白为什么这不起作用。它确实尝试构造存储库,但是为什么它也不能构造DB Context?甚至还没有达到我称之为UseSqlServer()的地步! 有什么想法吗?

更新1:

嗯...我现在看到了。很有可能是相关的:

enter image description here

更新2:

我现在有:

  • 将EF 6替换为Microsoft.EntityFrameworkCore.SqlServer
  • 已升级到netcoreapp2.2目标框架,以解决一些相互冲突的程序集版本。
  • 使存储库具有作用域。

但是我仍然遇到相同的错误。

1 个答案:

答案 0 :(得分:3)

我看到您已将LoadTestCleanUpServiceRepository注册为Singleton,而MyDbContext注册为Transient,然后您正尝试从MyDbContext解析LoadTestCleanUpServiceRepository。那就是问题所在。根据{{​​3}}文档:

  

从单例解决有范围的服务/临时服务很危险。处理后续请求时,可能导致服务的状态不正确。

解决方法是:如下注册LoadTestCleanUpServiceRepositoryMyDbContext

services.AddDbContext<MyDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("YourConnectionStringName")));

services.AddScoped<ILoadTestCleanUpServiceRepository, LoadTestCleanUpServiceRepository>();

现在问题应该消失了。