/// <summary> /// 添加模块 /// </summary> /// <param name="services">服务集合</param> /// <param name="module">模块</param> private static IServiceCollection AddModule(IServiceCollection services, BingModule module) { var type = module.GetType(); var serviceType = typeof(BingModule); if (type.BaseType?.IsAbstract == false) { // 移除多重继承的模块 var descriptors = services.Where(m => m.Lifetime == ServiceLifetime.Singleton && m.ServiceType == serviceType && m.ImplementationInstance?.GetType() == type.BaseType) .ToArray(); foreach (var descriptor in descriptors) { services.Remove(descriptor); } } if (!services.Any(m => m.Lifetime == ServiceLifetime.Singleton && m.ServiceType == serviceType && m.ImplementationInstance?.GetType() == type)) { services.AddSingleton(typeof(BingModule), module); module.AddServices(services); } return(services); }
/// <summary> /// 添加模块 /// </summary> /// <param name="type">类型</param> private IBingBuilder AddModule(Type type) { if (!type.IsBaseOn(typeof(BingModule))) { throw new BingFrameworkException($"要加载的模块类型“{type}”不派生于基类 {nameof(BingModule)}"); } if (_modules.Any(m => m.GetType() == type)) { return(this); } var tmpModules = new BingModule[_modules.Count]; _modules.CopyTo(tmpModules); var module = _sourceModules.FirstOrDefault(x => x.GetType() == type); if (module == null) { throw new BingFrameworkException($"类型为“{type.FullName}”的模块实例无法找到"); } _modules.AddIfNotContains(module); // 添加依赖模块 var dependTypes = module.GetDependModuleTypes(); foreach (var dependType in dependTypes) { var dependModule = _sourceModules.Find(m => m.GetType() == dependType); if (dependModule == null) { throw new BingFrameworkException($"加载模块{module.GetType().FullName}时无法找到依赖模块{dependType.FullName}"); } _modules.AddIfNotContains(dependModule); } // 按先层级后顺序的规则进行排序 _modules = _modules.OrderBy(m => m.Level).ThenBy(m => m.Order).ToList(); var logName = typeof(BingBuilder).FullName; tmpModules = _modules.Except(tmpModules).ToArray(); foreach (var tmpModule in tmpModules) { var moduleType = tmpModule.GetType(); var moduleName = Reflections.GetDescription(moduleType); Services.LogInformation($"添加模块 “{moduleName} ({moduleType.Name})” 的服务", logName); var tmp = Services.ToArray(); AddModule(Services, tmpModule); Services.ServiceLogDebug(tmp, moduleType.FullName); Services.LogInformation($"模块 “{moduleName} ({moduleType.Name})” 的服务添加完毕,添加了 {Services.Count - tmp.Length} 个服务\n", logName); } return(this); }
/// <summary> /// 添加指定模块。执行此功能后将仅加载指定的模块 /// </summary> /// <typeparam name="TModule">要添加的模块类型</typeparam> public IBingBuilder AddModule <TModule>() where TModule : BingModule { var type = typeof(TModule); if (_modules.Any(m => m.GetType() == type)) { return(this); } var tmpModules = new BingModule[_modules.Count]; _modules.CopyTo(tmpModules); var module = _source.FirstOrDefault(x => x.GetType() == type); if (module == null) { throw new Warning($"类型为“{type.FullName}”的模块实例无法找到"); } _modules.AddIfNotContains(module); // 添加依赖模块 var dependTypes = module.GetDependModuleTypes(); foreach (var dependType in dependTypes) { var dependModule = _source.Find(m => m.GetType() == dependType); if (dependModule == null) { throw new Warning($"加载模块{module.GetType().FullName}时无法找到依赖模块{dependType.FullName}"); } _modules.AddIfNotContains(dependModule); } // 按先层级后顺序的规则进行排序 _modules = _modules.OrderBy(m => m.Level).ThenBy(m => m.Order).ToList(); tmpModules = _modules.Except(tmpModules).ToArray(); foreach (var tmpModule in tmpModules) { AddModule(Services, tmpModule); } //var list = AddModules.ToList(); //list.AddIfNotContains(typeof(TModule)); //AddModules = list; return(this); }