【发布时间】: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<MyContext>(options => options...).AddScoped<IDbConnection>(sp=>sp.GetRequiredService<MyContext>().Database.GetDbConnection())对我有用(没有堆栈溢出异常)。 -
原来我想注入IDbConnection的类是使用MyContext解析的,它本身就是MyContext的依赖之一。不知道为什么.net core 的 DI 框架没有抛出循环依赖异常。所以这个类在依赖图中处于最低级别(位于无法注入具体上下文的框架/共享库中)。
标签: c# dependency-injection asp.net-core-2.2 ef-core-2.2