using Gurion.Schedule; using NetAdmin.Domain.Events; using NetAdmin.Host.Filters; using NetAdmin.SysComponent.Domain.Contexts; using NetAdmin.SysComponent.Host.Jobs; using NetAdmin.SysComponent.Host.Utils; using FreeSqlBuilder = NetAdmin.Infrastructure.Utils.FreeSqlBuilder; namespace NetAdmin.SysComponent.Host.Extensions; /// /// ServiceCollection 扩展方法 /// [SuppressSniffer] public static class ServiceCollectionExtensions { /// /// 添加上下文用户信息 /// public static IServiceCollection AddContextUserInfo(this IServiceCollection me) { return me.AddScoped(typeof(ContextUserInfo), _ => ContextUserInfo.Create()); } /// /// 添加 freeSql orm工具 /// public static IServiceCollection AddFreeSql( // this IServiceCollection me, FreeSqlInitMethods initMethods = FreeSqlInitMethods.None, Action freeSqlConfig = null) { // // 非调试模式下禁止同步数据库 // #if !DEBUG // initOptions = FreeSqlInitOptions.None; // #endif var dbOptions = App.GetOptions(); var eventPublisher = App.GetService(); var fSql = new FreeSqlBuilder(dbOptions).Build(initMethods, count => eventPublisher.PublishAsync(new SeedDataInsertedEvent(count))); _ = me.AddSingleton(fSql); fSql.Aop.AuditValue += SqlAuditor.DataAuditHandler; // Insert/Update自动值处理 #pragma warning disable VSTHRD110 // AOP事件发布(异步) fSql.Aop.CommandBefore += (_, e) => eventPublisher.PublishAsync(new SqlCommandBeforeEvent(e)); // 增删查改,执行命令之前触发 fSql.Aop.CommandAfter += (_, e) => eventPublisher.PublishAsync(new SqlCommandAfterEvent(e)); // 增删查改,执行命令完成后触发 fSql.Aop.SyncStructureBefore += (_, e) => eventPublisher.PublishAsync(new SyncStructureBeforeEvent(e)); // CodeFirst迁移,执行之前触发 fSql.Aop.SyncStructureAfter += (_, e) => eventPublisher.PublishAsync(new SyncStructureAfterEvent(e)); // CodeFirst迁移,执行完成触发 #pragma warning restore VSTHRD110 // 全局过滤器设置 freeSqlConfig?.Invoke(fSql); return me.AddScoped() // 注入工作单元管理器 .AddFreeRepository(null, App.Assemblies.ToArray()) // 批量注入 Repository .AddMvcFilter(); // 注入事务拦截器 } /// /// 添加定时任务 /// public static IServiceCollection AddSchedules(this IServiceCollection me) { return App.WebHostEnvironment.IsProduction() ? me.AddSchedule( // builder => builder // .AddJob(true, Triggers.PeriodSeconds(1).SetRunOnStart(true)) .AddJob(true, Triggers.PeriodMinutes(1).SetRunOnStart(true))) : me; } }