using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using System.Reflection; namespace IM.InitCommon { public static class AddDbContextExtensions { public static IServiceCollection AddAllDbContexts(this IServiceCollection services, Action action, IEnumerable assemblies) { //AddDbContextPool不支持DbContext注入其他对象,而且使用不当有内存暴涨的问题,因此不用AddDbContextPool Type[] types = new Type[] { typeof(IServiceCollection), typeof(Action), typeof(ServiceLifetime), typeof(ServiceLifetime) }; var methodAddDbContext = typeof(EntityFrameworkServiceCollectionExtensions) .GetMethod(nameof(EntityFrameworkServiceCollectionExtensions.AddDbContext), 1, types); foreach (var asmToLoad in assemblies) { Type[] typesInAsm = asmToLoad.GetTypes(); //Register DbContext //GetTypes() include public/protected ones //GetExportedTypes only include public ones //so that XXDbContext in Agrregation can be internal to keep insulated foreach (var dbCtxType in typesInAsm .Where(t => !t.IsAbstract && typeof(DbContext).IsAssignableFrom(t))) { //similar to serviceCollection.AddDbContextPool(opt=>new DbContextOptionsBuilder(dbCtxOpt)); var methodGenericAddDbContext = methodAddDbContext.MakeGenericMethod(dbCtxType); methodGenericAddDbContext.Invoke(null, new object[] { services, action, ServiceLifetime.Scoped, ServiceLifetime.Scoped }); services.AddScoped(sp => new Management.ManagementDbProbe((DbContext)sp.GetRequiredService(dbCtxType))); } } return services; } } }