首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >service.AddScoped()与service.AddDbContext()

service.AddScoped()与service.AddDbContext()
EN

Stack Overflow用户
提问于 2017-03-10 11:01:16
回答 1查看 5.2K关注 0票数 7

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

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

代码语言:javascript
运行
复制
<AppDbContextContract, AppDbContextMySql>
<AppDbContextContract, AppDbContextMsSql>

甚至把它们都藏在工厂后面。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-10 11:21:36

.AddDbContext还允许您同时配置它。配置不能使用抽象类型,因为您必须将一个IDbContextOptionsBuilder<T>传递到您的DbContext中,其中T是您的具体实现。

但是,如果要注入抽象类,则可以同时使用这两种方法。

代码语言:javascript
运行
复制
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,您需要编写

代码语言:javascript
运行
复制
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>

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42716771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档