基于依赖注入使用 EF Interceptor

💡 原文中文,约4300字,阅读约需11分钟。
📝

内容提要

本文介绍了如何在 EF Interceptor 中使用依赖注入。通过从依赖注入中获取更新用户的信息,实现了属性的自动更新。通过注册和创建对应的 Interceptor,可以在 DbContext 中使用依赖注入。同时,介绍了 Interceptor 的生命周期和实例化过程。

🔎

延伸解读

依赖注入在拦截器中的关键作用

文章通过 IUserIdProvider 接口从依赖注入容器获取用户信息,实现了 UpdatedBy 属性的自动填充。这避免了在拦截器中硬编码用户逻辑,使拦截器更灵活且易于测试。实际应用中,可以从 HttpContext 等环境上下文动态获取当前用户,而示例中的 UserIdProvider 仅返回固定值,展示了基本模式。

注册拦截器时的生命周期选择

拦截器可以注册为 Singleton 或 Scoped。由于默认 DbContext 是 Scoped,拦截器通常也注册为 Scoped,这样在同一个 scope 内,拦截器实例与 DbContext 实例一一对应。文章示例中,同一个 scope 内多次 SaveChanges 使用同一个拦截器实例,而不同 scope 则创建新实例,这通过打印的 hashCode 得到验证。

配置 DbContext 以使用依赖注入拦截器

在 AddDbContext 时,需要使用带 IServiceProvider 的 options 重载,通过 provider.GetRequiredService<DIAutoUpdateInterceptor>() 获取拦截器实例并添加到 options 中。这确保了拦截器能够从容器解析其依赖(如 IUserIdProvider),而不是手动实例化。文章完整示例展示了这一配置方式。

❓

Q&A

如何在 EF Interceptor 中使用依赖注入?

在 EF Interceptor 中使用依赖注入,需要通过 IServiceProvider 配置重载 DbContext,并在 AddInterceptor 时从 serviceProvider 中获取或创建对应的 Interceptor。

IUserIdProvider 接口的作用是什么?

IUserIdProvider 接口用于获取更新用户的信息,以便在属性自动更新时使用。

DIAutoUpdateInterceptor 类的功能是什么?

DIAutoUpdateInterceptor 类实现了 SaveChangesInterceptor,用于在保存更改时自动更新 BlogPost 实体的 UpdatedAt 和 UpdatedBy 属性。

如何注册 Interceptor 的生命周期?

注册 Interceptor 时可以选择 Singleton 或 Scoped 生命周期,具体取决于应用场景和需求。

在同一个 scope 中,Interceptor 实例是如何管理的?

在同一个 scope 中,Interceptor 实例是相同的,而在不同 scope 中,Interceptor 实例是不同的。

如何从依赖注入中获取当前用户的信息?

可以通过实现 IUserIdProvider 接口的 UserIdProvider 类,从当前环境上下文中获取用户信息,例如从 HttpContext 中获取。

➡️

继续阅读