using Autofac; using Autofac.Extensions.DependencyInjection; using Dapper; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyModel; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.Loader; using WIDESEA_Core.CacheManager; using WIDESEA_Core.Configuration; using WIDESEA_Core.Const; using WIDESEA_Core.Dapper; using WIDESEA_Core.DBManager; using WIDESEA_Core.EFDbContext; using WIDESEA_Core.Enums; using WIDESEA_Core.Extensions.AutofacManager; //using WIDESEA_Core.KafkaManager.IService; //using WIDESEA_Core.KafkaManager.Service; using WIDESEA_Core.ManageUser; using WIDESEA_Core.ObjectActionValidator; using WIDESEA_Core.Services; namespace WIDESEA_Core.Extensions { public static class AutofacContainerModuleExtension { // private static bool _isMysql = false; public static IServiceCollection AddModule(this IServiceCollection services, ContainerBuilder builder, IConfiguration configuration) { //services.AddSession(); //services.AddMemoryCache(); //初始化配置文件 AppSetting.Init(services, configuration); Type baseType = typeof(IDependency); var compilationLibrary = DependencyContext.Default .RuntimeLibraries .Where(x => !x.Serviceable && x.Type == "project") .ToList(); var count1 = compilationLibrary.Count; List assemblyList = new List(); foreach (var _compilation in compilationLibrary) { try { assemblyList.Add(AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(_compilation.Name))); } catch (Exception ex) { Console.WriteLine(_compilation.Name + ex.Message); } } builder.RegisterAssemblyTypes(assemblyList.ToArray()) .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract) .AsSelf().AsImplementedInterfaces() .InstancePerLifetimeScope(); builder.RegisterType().InstancePerLifetimeScope(); builder.RegisterType().InstancePerLifetimeScope(); //model校验结果 builder.RegisterType().InstancePerLifetimeScope(); string connectionString = DBServerProvider.GetConnectionString(null); if (DBType.Name == DbCurrentType.MySql.ToString()) { //2020.03.31增加dapper对mysql字段Guid映射 SqlMapper.AddTypeHandler(new DapperParseGuidTypeHandler()); SqlMapper.RemoveTypeMap(typeof(Guid?)); //services.AddDbContext(); //mysql8.x的版本使用Pomelo.EntityFrameworkCore.MySql 3.1会产生异常,需要在字符串连接上添加allowPublicKeyRetrieval=true services.AddDbContextPool(optionsBuilder => { optionsBuilder.UseMySql(connectionString, new MySqlServerVersion(new Version(8, 0, 11))); }, 64); } else if (DBType.Name == DbCurrentType.PgSql.ToString()) { services.AddDbContextPool(optionsBuilder => { optionsBuilder.UseNpgsql(connectionString); }, 64); } else { services.AddDbContextPool(optionsBuilder => { optionsBuilder.UseSqlServer(connectionString); }, 64); } //启用缓存 if (AppSetting.UseRedis) { builder.RegisterType().As().SingleInstance(); } else { builder.RegisterType().As().SingleInstance(); } //kafka注入 //if (AppSetting.Kafka.UseConsumer) // builder.RegisterType>().As>().SingleInstance(); //if (AppSetting.Kafka.UseProducer) // builder.RegisterType>().As>().SingleInstance(); return services; } } }