无法解析类型“Microsoft.EntityFrameworkCore.DbContextOptionsBuilder”的服务
Unable to resolve service for type 'Microsoft.EntityFrameworkCore.DbContextOptionsBuilder`
当我将 DbContextOptionsBuilder
注入 ASP.NET 核心 3.1 中的 CustomTicketStore
时。我收到异常消息
Some services are not able to be constructed (Error while validating
the service descriptor 'ServiceType:
Microsoft.AspNetCore.Authentication.Cookies.ITicketStore Lifetime:
Scoped ImplementationType: OneIAM.Services.CustomTicketStore': Unable
to resolve service for type
'Microsoft.EntityFrameworkCore.DbContextOptionsBuilder`1[OneIAM.Data.ApplicationDbContext]'
while attempting to activate '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>>();
}
}
首先,我测试了你的代码,发现它会用 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;
}
........
}
当我将 DbContextOptionsBuilder
注入 ASP.NET 核心 3.1 中的 CustomTicketStore
时。我收到异常消息
Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: Microsoft.AspNetCore.Authentication.Cookies.ITicketStore Lifetime: Scoped ImplementationType: OneIAM.Services.CustomTicketStore': Unable to resolve service for type 'Microsoft.EntityFrameworkCore.DbContextOptionsBuilder`1[OneIAM.Data.ApplicationDbContext]' while attempting to activate '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>>();
}
}
首先,我测试了你的代码,发现它会用 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;
}
........
}