在 Blazor 中使用带有 AddDbContextFactory 的标识
Posted
技术标签:
【中文标题】在 Blazor 中使用带有 AddDbContextFactory 的标识【英文标题】:Using Identity with AddDbContextFactory in Blazor 【发布时间】:2021-01-17 23:33:55 【问题描述】:在我的 Blazor .Net Core 3.1 服务器端应用程序中,我最近将 EF contect 范围从瞬态更改为使用工厂扩展,并且效果很好。但是,我将相同的 dbcontext 工厂代码添加到使用 Identity 的第二个项目中,并且在启动时出现异常。
InvalidOperationException: Unable to resolve service for type 'OMS.DALInterfaces.Models.OmsDbContext' while attempting to activate 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`9
当没有使用工厂类时,这工作正常(即让 DI 处理 OMSDbContext)
services.AddDbContext<OmsDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")),
ServiceLifetime.Transient
);
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<OmsDbContext>();
现在在项目中使用我尝试过的身份:
services.AddDbContextFactory<OmsDbContext>(opt =>
opt.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))
.EnableSensitiveDataLogging());
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<OmsDbContext>();
那么在使用 Factory 扩展时如何在启动时定义 Identity?
【问题讨论】:
有人成功使用 AddDbContextFactory 和 Identity 吗? 同样的问题。 【参考方案1】:克雷格,帮我们弄清楚了。
在 ConfigureServices 中,DbContext 的 AddScoped 并使用提供者从服务中获取工厂。然后,将实例返回给提供者,如下所示。身份规范使用范围,所以我在这里使用范围。
services.AddDbContextFactory<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
options.EnableSensitiveDataLogging();
);
services.AddScoped<ApplicationDbContext>(p => p.GetRequiredService<IDbContextFactory<ApplicationDbContext>>().CreateDbContext());
【讨论】:
很好,谢谢!这是推荐的模式吗?我在 MS 文档上没有找到任何内容。【参考方案2】:这是因为 Identity EntityFrameworkStores 假设您的 DbContext
也可以通过依赖注入获得。
您正在做的是添加工厂,而不是添加您的 DbContext
本身。
您需要同时添加两者。
void BuildOptions(DbContextOptionsBuilder options) => options
.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))
.EnableSensitiveDataLogging();
services.AddDbContext<OmsDbContext>(BuildOptions);
services.AddDbContextFactory<OmsDbContext>(BuildOptions);
services.AddDefaultIdentity<IdentityUser>(options =>
options.SignIn.RequireConfirmedAccount = true)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<OmsDbContext>();
【讨论】:
以上是关于在 Blazor 中使用带有 AddDbContextFactory 的标识的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Blazor 中将带有参数的 onclick 添加到按钮?
HttpClient 在 Blazor Webassembly 应用程序中不包含带有请求的 cookie