gpt4 book ai didi

asp.net-core - service.AddScoped() 与 service.AddDbContext()

转载 作者:行者123 更新时间:2023-12-01 17:59:34 28 4
gpt4 key购买 nike

假设我想实现不同的 DbContext(MySql、MsSql),但让应用程序完全不知道它。

因此,使用“AddScoped”(或任何其他)方法,我可以注册以下内容:

<AppDbContextContract, AppDbContextMySql>
<AppDbContextContract, AppDbContextMsSql>

或者甚至将它们隐藏在工厂后面。

但是使用 AddDbContext() 我什至看不到一种明显的方法来放置我需要的实现而不是抽象的 AppDbContextContract。

除了提供在基本应用程序中添加数据库上下文的简单方法之外,AddDbContext() 方法还有什么用途?我应该更喜欢“通用”DI 方法而不是它吗?

最佳答案

.AddDbContext还允许您同时配置它。配置无法与抽象类型一起使用,因为您必须传递 IDbContextOptionsBuilder<T>进入您的 DbContext,其中 T是你的具体实现。

但是,如果您想注入(inject)抽象类,则可以将两者一起使用。

services.AddDbContext<AppDbContextMySql>( /* configure it */);
services.AddDbContext<AppDbContextSqlServer>( /* configure it */);

services.AddScoped<AppDbContextContract>(p => p.GetRequiredService<AppDbContextMySql>());
services.AddScoped<AppDbContextContract>(p => p.GetRequiredService<AppDbContextSqlServer>());

不使用.AddDbContext你需要写

var dbOptionsA = new DbContextOptionsBuilder<AppDbContextMySql>();
dbOptionsA.UseMySql(...);
services.AddSingleton(dbOptionsA);
var dbOptionsB = new DbContextOptionsBuilder<AppDbContextSqlServer>();
dbOptionsB.UseSqlServer(...);
services.AddSingleton(dbOptionsB);

services.AddScoped<AppDbContextContract,AppDbContextMySql>();
services.AddScoped<AppDbContextContract,AppDbContextSqlServer>();

不太漂亮,是吗?

但是如果配置是从外部进行的,那么可以。您只能有一个 AppDbContextContract ,它接受 IDbContextOptions<AppDbContextContract>并在库中配置它。您仍然需要注册IDbContextOptions<AppDbContextContract>在某处启动期间。

关于asp.net-core - service.AddScoped() 与 service.AddDbContext(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42716771/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com