【问题标题】:ASP.NET CORE DI - Resolve IDbConnection from EF Core's Database.GetDbConnection()ASP.NET CORE DI - 从 EF Core 的 Database.GetDbConnection() 中解析 IDbConnection
【发布时间】:2020-05-03 05:48:08
【问题描述】:

在我的应用程序中,我在大多数需要数据访问的地方使用 EF Core DbContext。在需要底层连接的地方,我只需注入DbContext 并使用DbContext.Database.GetDbConnection() 获取连接。 在其中一个类库中(无法注入 ef 核心上下文),我需要注入 IDbConnection 以使数据库访问正常工作。

我试过了

services.AddScoped<IDbConnection>(sp=>sp.GetRequiredService<MyContext>().Database.GetDbConnection())

但它会引发 stackoverflow 异常。

目前,我正在使用以下-

services.AddScoped<IDbConnection>(sp=>new SqlConnection(connStringFromConfig))

这可行,但我正在寻找一种替代方案,它可以受益于 DbContext 的底层连接内置的连接弹性/执行策略(当使用 EnableRetryOnFailures 时)。

有什么办法可以做到吗?

【问题讨论】:

  • 什么是GetConnection()?你的意思是GetDbConnecttion()
  • 是的。已编辑。谢谢。
  • 好的,你如何注册你的数据库上下文?因为services.AddDbContext&lt;MyContext&gt;(options =&gt; options...).AddScoped&lt;IDbConnection&gt;(sp=&gt;sp.GetRequiredService&lt;MyContext&gt;().Database.GetDbConnection()) 对我有用(没有堆栈溢出异常)。
  • 原来我想注入IDbConnection的类是使用MyContext解析的,它本身就是MyContext的依赖之一。不知道为什么.net core 的 DI 框架没有抛出循环依赖异常。所以这个类在依赖图中处于最低级别(位于无法注入具体上下文的框架/共享库中)。

标签: c# dependency-injection asp.net-core-2.2 ef-core-2.2


【解决方案1】:

Connection resiliency 自动重试失败的数据库命令。它是 Entity Framework Core 的一个特性,通常可以在 DbContextOnConfiguring 方法或 ConfigureServices 方法的 Startup.cs 中进行配置。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder
        .UseSqlServer("<connection string>", options => options.EnableRetryOnFailure());
}

这个特性和EntityFramework有关,它不是SqlConnection的直接特性。当您在项目中使用SqlConnection(或接口IDbConnection)而不使用DbContext时,您可能需要实现自己的重试。

【讨论】:

    猜你喜欢
    • 2017-05-14
    • 1970-01-01
    • 2017-07-28
    • 2018-02-24
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 2019-02-15
    • 2016-05-26
    相关资源
    最近更新 更多