我可以将 DbContext 作为接口或委托传递吗

Can i Pass DbContext as interface or delegate

我有两个 dbcontext 所以想通过一些函数传递它所以我可以在两个 dbcontext 之间切换或者我必须更改所有 api controller

  public class AccountClassesController : ControllerBase
{
    private readonly  ApplicationDbContext _context;


    public AccountClassesController(ApplicationDbContext context)
    {
        _context = context;
    }

    // GET: api/AccountClasses
    [HttpGet]
    public async Task<ActionResult<IEnumerable<AccountClass>>> GetAccountClass()
    {
        return await _context.AccountClass.ToListAsync();
    }

不想从控制器调用 ApplicationDbContext,通过某些函数或其他方式调用它

我现在已经为 postgresql 和 sqlserver 实现了数据库连接,每个都首先在代码中创建了不同类型的迁移,所以必须创建两个 dbcontext,现在我想当我使用 postgresql 或 sql server

时能够在 dbcontext 之间切换

您可以在此处查看此答案 is it a good practice to pass an EF DbContext as delegate in services to attach all changes on it。 但是,如果您的应用程序没有任何性能问题,即使您实例化了新的上下文,也没有问题,因为 EF 的管理和构建速度非常快。

是的,您可以创建接口并修改您的 ApplicationDbContext 来实现。

界面

public interface IAccountClass {
    Task<IEnumerable<AccountClass>> GetAccountClass();
}
public class AppDbContext: DbContext, IAccount {
   /* implementing interface
   */
  public Task<IEnumerable<AccountClass>> GetAccountClass() {
    return this.AccountClass.ToListAsync();
  }
}

在您的控制器中注入 DbContext 实例转换为接口:

   public AccountClassesController(IAccountClass accountClass)
    {
        _accountClass = accountClass;
    }

    // GET: api/AccountClasses
    [HttpGet]
    public async Task<ActionResult<IEnumerable<AccountClass>>> GetAccountClass()
    {
        return await this._accountClass.GetAccountClass();
    }

您必须配置依赖项注入框架以将新的 ApplicationDbContext 作为 IAccountClass 注入。