资讯动态

EntityFrameworkCore.Triggered三种触发器注册方式:UseTriggers、DI与程序集扫描完整清单

发布时间:2026/8/22 14:15:01 来源:尧图企业网站定制
EntityFrameworkCore.Triggered三种触发器注册方式UseTriggers、DI与程序集扫描完整清单【免费下载链接】EntityFrameworkCore.TriggeredTriggers for EFCore. Respond to changes in your DbContext before and after they are committed to the database.项目地址: https://gitcode.com/gh_mirrors/en/EntityFrameworkCore.TriggeredEntityFrameworkCore.Triggered 是一款为 Entity Framework CoreEF Core提供触发器Triggers支持的开源 .NET 库可以在 DbContext 提交到数据库之前BeforeSave和之后AfterSave自动执行你的自定义逻辑——比如自动填充注册日期、发送欢迎邮件、打上软删除标记。本文将用一份完整清单讲透触发器的三种注册方式UseTriggers 直接注册、DI 容器注册、程序集扫描注册帮你快速选对方案。 先搞懂触发器解决了什么问题用 EF Core 时你一定写过这类代码每新增一个学生就要自动设置注册时间。如果不借助触发器这些逻辑只能散落在 Controller、Service 的各个SaveChanges调用点附近容易遗漏。EntityFrameworkCore.Triggered 的思路是让实体类型自己绑定触发器逻辑。例如实现IBeforeSaveTriggerStudent接口的类每当Student被保存时就会自动被调用。官方示例中新增学生时自动写入RegistrationDatepublic class StudentAssignRegistrationDate : IBeforeSaveAsyncTriggerStudent { public Task BeforeSaveAsync(ITriggerContextStudent context, CancellationToken cancellationToken) { if (context.ChangeType ChangeType.Added) { context.Entity.RegistrationDate DateTime.Today; } return Task.CompletedTask; } }完整示例可查看 StudentAssignRegistrationDate.cs。触发器写好之后关键问题来了怎么把它注册给 DbContext这就是本文的主题。 方式一UseTriggers 直接注册最直观推荐新手入门在配置 DbContext 时调用UseTriggers并通过AddTriggerT把触发器逐个点名注册services.AddDbContextApplicationDbContext(options { options.UseTriggers(triggerOptions { triggerOptions.AddTriggerStudentAssignRegistrationDate(); triggerOptions.AddTriggerSendWelcomingEmail(); }); });✅优点一眼就能看出哪个 DbContext 挂了哪些触发器配置集中、调试友好⚠️注意这种方式注册的触发器默认是 Transient 生命周期如果触发器依赖其他服务如IEmailService需要配合 DI 注册见方式二源码入口UseTriggers扩展方法定义在 TriggersDbContextOptionsExtensions.csAddTrigger等链式配置在 TriggersContextOptionsBuilder.csUseTriggers里除了注册触发器还可以顺手配置级联行为例如限制触发器级联的最大轮数防止死循环options.UseTriggers(triggerOptions { triggerOptions.CascadeBehavior(CascadeBehavior.EntityAndType).MaxCascadeCycles(20); }); 方式二DI 容器注册中大型 Web 项目的推荐做法项目 2.3 / 1.4 版本起官方推荐把触发器交给依赖注入容器管理。做法分两步第一步把触发器作为普通服务注册进 DI 容器services.AddTriggerStudentAssignRegistrationDate(); // 默认 Scoped 生命周期第二步DbContext 只调用无参的UseTriggers()它会从 DI 容器自动发现所有已注册的触发器services.AddDbContextApplicationDbContext(options options.UseTriggers());✅优点触发器可以自然构造注入任意服务邮件服务、日志服务等生命周期Scoped/Singleton/Transient完全由你控制✅适合场景AspNetCore 等 DI 驱动的应用源码位置AddTriggerT与触发器类型自动映射逻辑在 ServiceCollectionExtensions.cs属于EntityFrameworkCore.Triggered.ExtensionsNuGet 包 小技巧同一个实体类型可以同时有多个触发器它们的执行顺序默认遵循注册顺序也可以通过实现ITriggerPriority接口自定义优先级数字越小越先执行常用优先级常量见 CommonTriggerPriorities.cs。 方式三程序集扫描 AddAssemblyTriggers触发器多时最省力当触发器数量达到几十个、散落在多个类里时逐个AddTrigger太繁琐。EntityFrameworkCore.Triggered.Extensions包提供了程序集扫描自动遍历指定程序集中的所有类型凡是实现了触发器接口IBeforeSaveTriggerT、IAfterSaveTriggerT及生命周期触发器接口的类都会被自动注册。它有两种等价用法用法 A写在UseTriggers配置里默认扫描调用方程序集即你当前代码所在的程序集services.AddDbContextApplicationDbContext(options options.UseTriggers(triggerOptions triggerOptions.AddAssemblyTriggers()));用法 B直接注册到 DI 容器再配合无参UseTriggers()services.AddAssemblyTriggers(); services.AddDbContextApplicationDbContext(options options.UseTriggers());✅优点新增触发器零配置写完接口实现类即可生效天然适合按实体类型分文件夹组织的触发器代码参考官方样本 Triggers 目录⚠️注意可以显式传入params Assembly[]指定扫描多个程序集默认生命周期为 Scoped也可通过重载自定义源码位置DI 侧扫描逻辑见 ServiceCollectionExtensions.csUseTriggers内的扫描重载见 TriggersContextOptionsBuilderExtensions.cs 三种注册方式对比清单维度UseTriggers AddTriggerDI 容器注册程序集扫描 AddAssemblyTriggers配置位置DbContext Options 内IServiceCollectionDI 或 DbContext Options 内注册粒度逐个显式指定逐个显式指定按程序集自动批量发现触发器生命周期默认 Transient可自定义完全自定义默认 Scoped默认 Scoped可自定义触发器可注入服务受限✅ 完全支持✅ 完全支持新增触发器成本改一行配置改一行配置✅ 零配置适用场景小型项目、快速上手中大型 DI 驱动应用触发器数量多、模块化组织 附加技巧让 DbContext 注册自带触发器如果不想每次写AddDbContext都记得调UseTriggers()可以用库提供的快捷方法一步到位自动帮你启用触发器services.AddTriggeredDbContextApplicationDbContext(); // 使用 DbContext 池化时用这个版本内部自动处理服务提供者的发现 services.AddTriggeredDbContextPoolApplicationDbContext();这些方法都在 ServiceCollectionExtensions.cs 中涵盖AddTriggeredDbContext、AddTriggeredDbContextPool、AddTriggeredDbContextFactory等变体。特别注意一旦启用了 EF Core 的 DbContext 池化就必须换成AddTriggeredDbContextPool否则触发器可能无法正确工作。❓ 新手常见疑问Q1三种方式可以混用吗可以。核心是UseTriggers()开启机制触发器来源既可以是 Options 内显式AddTrigger也可以来自 DI 容器的AddTriggerT或程序集扫描。实践中常见组合是DI 注册 无参 UseTriggers或程序集扫描 无参 UseTriggers。Q2多个触发器执行顺序怎么控制默认按注册顺序执行支持按类型继承链从基类到派生类排序实现ITriggerPriority可自定义优先级。Q3触发器里改实体还会再次触发触发器吗会这叫级联Cascading。默认开启EntityAndType级联策略并限制最大级联轮数防止无限循环也可以配置为NoCascade完全关闭。 相关资料索引项目总览与完整示例README.md最小可运行样本Hello WorldProgram.cs触发器发现与调度核心TriggerDiscoveryService.cs触发器会话编排器TriggerSession.cs触发器接口定义Lifecycles 目录掌握这份清单后你只需按项目规模选择小项目用UseTriggers 直接注册求直观Web 应用用DI 注册求灵活触发器成规模时用程序集扫描求省心——三种方式底层机制一致随时可以平滑迁移升级。【免费下载链接】EntityFrameworkCore.TriggeredTriggers for EFCore. Respond to changes in your DbContext before and after they are committed to the database.项目地址: https://gitcode.com/gh_mirrors/en/EntityFrameworkCore.Triggered创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价