假设我想实现不同的DbContexts (MySql,MsSql),但是让一个应用程序完全不知道它。
因此,使用"AddScoped“(或任何其他)方法,我可以注册如下:
<AppDbContextContract, AppDbContextMySql>
<AppDbContextContract, AppDbContextMsSql>
甚至把它们都藏在工厂后面。
但是使用AddDbContext(),我甚至看不到一种明显的方法来放置我所需要的实现,而不是抽象的AppDbContextContract。
除了提供在基本应用程序中添加DB上下文的简单方法之外,AddDbContext()方法还有什么用途?我应该更喜欢“通用”DI方法而不是它吗?
发布于 2017-03-10 11:21:36
.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>
。
https://stackoverflow.com/questions/42716771
复制相似问题