簡體   English   中英

使用相同接口實現的多個 DBContext

[英]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;
 }

在此處輸入圖像描述 如果我有多個具有通用接口的存儲庫/服務,我在這里期待我見過的兩個DbContexts像這種方法一樣有效。

我相信這是因為您正在嘗試使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM