首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >EFCore在DbCommandInterceptor中的注入服务

EFCore在DbCommandInterceptor中的注入服务
EN

Stack Overflow用户
提问于 2020-09-26 14:11:39
回答 1查看 778关注 0票数 2

从我为EF找到的数据库拦截器中可以看出,它们必须使用Startup.cs方法在AddInterceptors中注册。此方法接收实例,使拦截器成为单例。

我需要在拦截器中注入一个作用域服务,这样是不可能的。

有没有办法向DbContext中添加作用域db拦截器?

代码语言:javascript
运行
复制
services.AddDbContext<DatabaseContext>(options =>
    options.UseSqlServer(
        Configuration.GetConnectionString(...)
    .AddInterceptors(new DatabaseLogIntgerceptor()); 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-26 15:48:13

此方法接收实例,使拦截器成为单例。

实际上不是单身,而是限定范围的。

AddDbContext几个过载,所有参数都有两个可选参数

contextLifetime容器中注册DbContext服务的生存期。 optionsLifetime容器中注册DbContextOptions服务的生存期。

两者都默认为ServiceLifetime.ScopedoptionsLifetime还控制调用选项配置操作的范围。

所以在默认情况下

代码语言:javascript
运行
复制
.AddInterceptors(new DatabaseLogIntgerceptor())

将按每个作用域调用,从而可以在其中注入作用域服务。

至于如何做到这一点,您必须使用AddDbContext重载和动作接收IServiceProvider,并解析服务(或保护器),例如

代码语言:javascript
运行
复制
services.AddDbContext<DatabaseContext>((sp, options) => options
    .UseSqlServer(
        Configuration.GetConnectionString(...)
    )
    .AddInterceptors(
        sp.GetRequiredService<DatabaseLogInterceptor>()
    )
);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64078656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档