[英]Multiple DBContext implemented with same Interface
我正在嘗試注冊使用公共接口( IDbContext
)實現的多個(2) DbContexts
。 然后我想在我的 controller 中使用一些邏輯來決定我將使用哪個上下文。
我在HomeController
中注入IEnumerable<IDbContext>
但它僅使用我注冊的第一個實例進行解析。
程序.cs
builder.Services.AddDbContext<IDbContext, ApplicationDbContext>(context => { context.UseInMemoryDatabase("ConferencePlanner");});
builder.Services.AddDbContext<IDbContext, Application2DbContext>(context => { context.UseInMemoryDatabase("ConferencePlanner2");});
DBContext1
public class ApplicationDbContext: DbContext, IDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options): base(options){}
}
數據庫上下文2
public class Application2DbContext: DbContext, IDbContext
{
public Application2DbContext(DbContextOptions<Application2DbContext> options): base(options){}
}
IDbContext
public interface IDbContext {}
Controller:
private readonly IEnumerable<IDbContext> contexts;
public HomeController(ILogger<HomeController> logger, IEnumerable<IDbContext> contexts)
{
_logger = logger;
this.contexts = contexts;
}
我相信這是因為您正在嘗試使用 AddDbContext 方法注冊數據庫上下文。 如果您嘗試使用工廠注冊您的實例,它應該可以按預期工作。 代碼可能如下所示:
builder.Services.AddTransient<IDbContext>(sp => {
var context = new ApplicationDbContext();
...
context.UseInMemoryDatabase("ConferencePlanner");
return context;
});
builder.Services.AddTransient<IDbContext>(sp => {
var context = new ApplicationDb2Context();
...
context.UseInMemoryDatabase("ConferencePlanner2");
return context;
});
然后,當您將 IEnumerable 傳遞給 controller 時,您將獲得兩個實例。 但是,我會考慮在特定情況下使用范圍上下文,以便 controller 始終使用唯一實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.