假设我想实现不同的 DbContext(MySql、MsSql),但让应用程序完全不知道它。
因此,使用“AddScoped”(或任何其他)方法,我可以注册如下内容:
<AppDbContextContract, AppDbContextMySql>
<AppDbContextContract, AppDbContextMsSql>
或者甚至将它们隐藏在工厂后面。
但是使用 AddDbContext() 我什至看不到一种明显的方法来放置我需要的实现而不是抽象的 AppDbContextContract。
除了提供在基本应用程序中添加数据库上下文的简单方法之外,AddDbContext() 方法还有什么用处?我应该更喜欢“通用”DI 方法而不是它吗?
.AddDbContext
还允许您同时配置它。配置不能与抽象类型一起使用,因为你必须传递一个IDbContextOptionsBuilder<T>
进入你的 DbContext,其中T
是你的具体实现。
但是,如果您想注入抽象类,则可以一起使用两者。
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>
在某处启动期间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)