using Castle.Core.Logging; using EntityFramework.Exceptions.SqlServer; using Hangfire.SqlServer; using IRaCIS.Core.Application.Triggers; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infra.EFCore; using IRaCIS.Core.Infra.EFCore.Interceptor; using Medallion.Threading; using Medallion.Threading.SqlServer; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using StackExchange.Redis; namespace IRaCIS.Core.API { public static class EFSetup { public static void AddEFSetup( this IServiceCollection services, IConfiguration configuration,string envName) { services.AddHttpContextAccessor(); services.AddScoped(); services.AddScoped(); services.AddScoped(); // First, register a pooling context factory as a Singleton service, as usual: //这个注入没有成功--注入是没问题的,构造函数也只是支持参数就好,错在注入的地方不能写DbContext //Web程序中通过重用池中DbContext实例可提高高并发场景下的吞吐量, 这在概念上类似于ADO.NET Provider原生的连接池操作方式,具有节省DbContext实例化成本的优点 services.AddDbContext((sp, options) => { // 在控制台 //public static readonly ILoggerFactory MyLoggerFactory = LoggerFactory.Create(builder => { builder.AddConsole(); }); var logFactory = LoggerFactory.Create(builder => { builder.AddDebug(); }); var dbType = configuration.GetSection("ConnectionStrings:Db_Type").Value ; if (!string.IsNullOrWhiteSpace(dbType) && dbType == "pgsql") { options.UseNpgsql(@"Host=106.14.89.110;Port=5432;Username=sa;Password=pgsql_pwd;Database=Test2_PG"); } else { options.UseSqlServer(configuration.GetSection("ConnectionStrings:RemoteNew").Value, contextOptionsBuilder => contextOptionsBuilder.EnableRetryOnFailure()); } options.UseLoggerFactory(logFactory); options.UseExceptionProcessor(); options.EnableSensitiveDataLogging(); options.AddInterceptors(new QueryWithNoLockDbCommandInterceptor()); options.AddInterceptors(sp.GetServices()); options.UseProjectables(); //options.AddInterceptors(new AuditingInterceptor(configuration.GetSection("ConnectionStrings:RemoteNew").Value)); //options.UseTriggers(triggerOptions => triggerOptions.AddTrigger()); //options.UseTriggers(triggerOptions => triggerOptions.AddAssemblyTriggers(typeof(SubjectVisitTrigger).Assembly)); options.UseTriggers(triggerOptions => { triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); //triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); }); }); // Register an additional context factory as a Scoped service, which gets a pooled context from the Singleton factory we registered above, //services.AddScoped(); //// Finally, arrange for a context to get injected from our Scoped factory: //services.AddScoped(sp => sp.GetRequiredService().CreateDbContext()); //注意区分 easy caching 也有 IDistributedLockProvider services.AddSingleton(sp => { //var connection = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]!); return new SqlDistributedSynchronizationProvider(configuration.GetSection("ConnectionStrings:RemoteNew").Value); }); //services.AddAssemblyTriggers(typeof(SubjectVisitImageDateTrigger).Assembly); } } }