#if netcoreapp using FreeSql; using System; using System.Linq; using System.Reflection; namespace Microsoft.Extensions.DependencyInjection { public static class FreeSqlDbContextDependencyInjection { static IServiceCollection AddFreeDbContext(this IServiceCollection services, Type dbContextType, Action options) { services.AddScoped(dbContextType, sp => { DbContext ctx = null; try { var ctor = dbContextType. GetConstructors().FirstOrDefault(); var ctorParams = ctor.GetParameters().Select(a => sp.GetService(a.ParameterType)).ToArray(); ctx = Activator.CreateInstance(dbContextType, ctorParams) as DbContext; } catch(Exception ex) { throw new Exception(DbContextStrings.AddFreeDbContextError_CheckConstruction(dbContextType.Name), ex); } if (ctx != null && ctx._ormScoped == null) { var builder = new DbContextOptionsBuilder(); options(builder); ctx._ormScoped = DbContextScopedFreeSql.Create(builder._fsql, () => ctx, () => ctx.UnitOfWork); ctx._optionsPriv = builder._options; if (ctx._ormScoped == null) throw new Exception(DbContextStrings.ConfigureUseFreeSql); ctx.InitPropSets(); } return ctx; }); return services; } public static IServiceCollection AddFreeDbContext(this IServiceCollection services, Action options) where TDbContext : DbContext => AddFreeDbContext(services, typeof(TDbContext), options); public static IServiceCollection AddFreeDbContext(this IServiceCollection services, Action options, Assembly[] assemblies) { if (assemblies?.Any() == true) foreach (var asse in assemblies) foreach (var dbType in asse.GetTypes().Where(a => a.IsAbstract == false && typeof(DbContext).IsAssignableFrom(a))) AddFreeDbContext(services, dbType, options); return services; } } } #endif