【问题标题】:How to inject / intercept DbConnection instances for an existing db provider?如何为现有的数据库提供者注入/拦截 DbConnection 实例?
【发布时间】:2019-07-26 08:01:36
【问题描述】:

假设我有一个 ASP.NET Core 应用程序,其控制器使用 DbContext 实例作为构造函数参数,遵循标准依赖注入约定。

控制器和DbContext 类型都与数据库无关。该应用程序设置了每个 DI DbContext 实例在其 StartUp 类中使用的默认选项。在运行时的某一时刻,EF Core 将在判断有必要时实例化 SqlConnection 的实例。

我对如何创建此连接实例感兴趣。更具体地说,我想在InfoMessageStateChange 上附加事件处理程序。但是,这必须以不会破坏 EF Core 的正常行为和连接管理的方式完成。

是否有任何服务可以注入 (IoC) 以便 EF 使用我自己的 SqlConnection 实例工厂?还是有至少一种方法可以拦截它创建的实例?

【问题讨论】:

  • 有点不清楚SqlConenction 和实体句柄之间有什么样的联系(我假设InfoMessage 是你的实体)
  • (SqlConnection)DbContext.Database.Connection? docs.microsoft.com/en-us/dotnet/api/…
  • @JessedeWit 不幸的是,这是 EF6。我正在寻找 EFCore 解决方案。
  • 这些是实体框架 6.2.0 文档,但我想这对你帮助不大......

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


【解决方案1】:

这个怎么样,来自ef core docs: (在第一次评论后编辑)

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        SqlConnection connection = GetSqlConnection();
        services.AddDbContext(options => options.UseSqlServer(connection));
    }
}

【讨论】:

  • 恐怕这违反了 DbContext 类型必须与数据库无关的要求。相同的上下文对象需要能够与完全不同的数据库提供程序一起使用。应用程序可以知道应该使用哪个数据库服务器,但上下文是在外部项目中以可重用的方式定义的。我真正在这里寻找的是一种 IoC 方法。也许根本没有... :-\ 不过,我仍然非常感谢您的努力。谢谢。
  • 谢谢,但这引发了很多问题(恨我吗?:))。使用这种模式,当不再需要连接实例时,谁负责处理它?当多个线程尝试打开/关闭该唯一实例时会发生什么?如果我有其他 DbContext 类,它们是否也应该共享该唯一实例?
  • 在这里,这可能会提示您我在寻找什么:codeproject.com/Articles/1206764/…
  • 再次感谢您的帮助。
  • 不,你有一个有效的观点。您希望能够管理连接生命周期。而我其实不知道。希望别人能回答你的问题。
猜你喜欢
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 2012-06-11
  • 1970-01-01
相关资源
最近更新 更多