如何在DbCommandInterceptor中使用Service或DbContext?

我有一个将数据从MySql数据库同步到SQL Server数据库的应用程序。

考虑这两个DbContext服务:

services.AddDbContext<SqlServerContext>(options => options
    .UseSqlServer(Configuration.getconnectionString("SqlServer")));

services.AddDbContext<MySqlContext>(options => options
    .UseMySql(Configuration.getconnectionString("MySql"))
    .AddInterceptors(new MySqlInterceptor()));

MySqlInterceptor()中;我想注入/解析/使用Service甚至是SqlServerContext,以获得配置来修改CommandText

有什么想法吗?

flossyeye2 回答:如何在DbCommandInterceptor中使用Service或DbContext?

根据要覆盖的方法,您会在方法定义中收到CommandEventData对象,该对象具有DbContext作为属性。

关于服务和配置,您可以在注册之前配置拦截器。
代替这个:

services.AddDbContext<MySqlContext>(options => options
    .UseMySql(Configuration.GetConnectionString("MySql"))
    .AddInterceptors(new MySqlInterceptor()));

你可以做

var interceptor = new MySqlInterceptor(service1,service2 ... etc);
services.AddDbContext<MySqlContext>(options => options
 .UseMySql(Configuration.GetConnectionString("MySql"))
 .AddInterceptors(interceptor))

如何解析拦截器实例:
如果您需要自动连接拦截器的依赖项,则可以执行以下操作

services.AddTransient<Service1>();
services.AddTransient<Service2>();
services.AddTransient<MySqlInterceptor>();
// resolve the instalce of the interceptor
var serviceProvider = services.BuildServiceProvider();
var interceptor = serviceProvider.GetService<MySqlInterceptor>();
// configure mysql context and interceptor
services.AddDbContext<MySqlContext>(options => options
 .UseMySql(Configuration.GetConnectionString("MySql"))
 .AddInterceptors(interceptor))
,

正如@vasil在他的answer中提到的:

  

根据您要覆盖的方法,您将收到   方法定义中的CommandEventData对象具有   Foo作为财产。

在我的情况下,我想解决使用另一个 DbContext的服务,事实证明这很麻烦。因此,我最终将所需的设置放入appsettings.json中,并使用DbContext服务获取设置值并将其发送给Interceptor构造函数:

IConfiguration

注意:如果您找到了这个答案,并且正在寻找一种方法来解决services.AddDbContext<MySqlContext>(options => options .UseMySql(Configuration.GetConnectionString("MySql")) .AddInterceptors(new MySqlInterceptor(Configuration["SettingValue"]))); 方法内的服务,而无需调用ConfigureService,就像David Fowler所说的那样。在Github issue上,您将是:

  

在尝试构建容器时构建容器

您最终将拥有:

  

2个容器,其中一个将永远不会被丢弃。

您可以按照Nkosi在其answer中的建议进行操作:

BuildServiceProvider
本文链接:https://www.f2er.com/3105298.html

大家都在问