无法解析类型为“ Microsoft.EntityFrameworkCore.DbContextOptionsBuilder”的服务

时间:2020-08-23 08:11:14

标签: asp.net-core entity-framework-core identityserver4

在ASP.NET core 3.1中将DbContextOptionsBuilder注入CustomTicketStore时。我收到异常消息

某些服务无法构建(验证时出错 服务描述符'ServiceType: Microsoft.AspNetCore.Authentication.Cookies.ITicketStore生命周期: 作用域实施类型:OneIAM.Services.CustomTicketStore':无法 解决类型的服务 'Microsoft.EntityFrameworkCore.DbContextOptionsBuilder`1 [OneIAM.Data.ApplicationDbContext]' 尝试激活“ OneIAM.Services.CustomTicketStore”时。)

下面是启动文件中的代码。

        public virtual void ConfigureServices(IServiceCollection services)
        {
          ...

          // Persistent ticket/cookie store to provide durable user sessions
          services.AddScoped<ITicketStore, CustomTicketStore>();
          var optionsBuilder = GetDbContextOptionsBuilder(services);

          services.ConfigureApplicationCookie(options =>
          {
            options.SlidingExpiration = true;
            options.SessionStore = new CustomTicketStore(optionsBuilder);  <=
          });
        }

        private static DbContextOptionsBuilder<ApplicationDbContext> GetDbContextOptionsBuilder(IServiceCollection services)
        {
            using (var scope = services.BuildServiceProvider().CreateScope())
            {
                return scope.ServiceProvider.GetService<DbContextOptionsBuilder<ApplicationDbContext>>();
            }
        }

1 个答案:

答案 0 :(得分:1)

首先,我测试了您的代码,发现它会用services.AddScoped<ITicketStore, CustomTicketStore>();重现您的错误 这是我的CustomTicketStore:

public class CustomTicketStore: ITicketStore
    {
        private readonly DbContextOptionsBuilder<ApplicationDbContext> _optionsBuilder;
        

        public CustomTicketStore(DbContextOptionsBuilder<ApplicationDbContext> optionsBuilder)
        {
            _optionsBuilder = optionsBuilder;
        }

        .......
    }

我发现如果我向CustomTicketStore添加不带参数的构造函数,它将起作用:

public class CustomTicketStore: ITicketStore
    {
        private readonly DbContextOptionsBuilder<ApplicationDbContext> _optionsBuilder;
        public CustomTicketStore()
        {
        }

        public CustomTicketStore(DbContextOptionsBuilder<ApplicationDbContext> optionsBuilder)
        {
            _optionsBuilder = optionsBuilder;
        }

        ........
    }