/// <summary> /// 组织模块 /// </summary> /// <param name="moduleTypes"></param> /// <param name="descriptorBuilder"></param> protected virtual void OrganizationModule(IEnumerable <Type> moduleTypes, IModuleDescriptorBuilder descriptorBuilder) { try { var allModuleDescriptors = AppModuleDependencyUtil.FindAllDependedModuleDescriptors(moduleTypes, descriptorBuilder); SortedModuleDescriptors = SortModuleDescriptors(allModuleDescriptors).ToList().AsReadOnly(); SortedModuleTypes = SortedModuleDescriptors.Select(m => m.Type).ToList().AsReadOnly(); ModuleDependencyRoots = SortedModuleDescriptors.Where(m => m.Dependents.IsNullOrEmpty()).ToList().AsReadOnly(); } catch (ModularityException) { throw; } catch (Exception ex) { throw new ModularityException("SortModuleDescriptors Fail", ex); } }
/// <summary> /// 收集模块 /// </summary> /// <param name="moduleContainer"></param> /// <param name="moduleType"></param> /// <param name="descriptorBuilder"></param> private static IModuleDescriptor CollectModuleDescriptors(Dictionary <Type, IModuleDescriptor> moduleContainer, Type moduleType, IModuleDescriptorBuilder descriptorBuilder) { if (moduleContainer.TryGetValue(moduleType, out var existedDescriptor)) { return(existedDescriptor); } var descriptor = descriptorBuilder.Create(moduleType); moduleContainer.Add(moduleType, descriptor); var dependencies = descriptorBuilder.GetDependedModuleTypes(moduleType) .Select(dependedModuleType => CollectModuleDescriptors(moduleContainer, dependedModuleType, descriptorBuilder).AddDependent(descriptor)); descriptor.AddDependencies(dependencies); return(descriptor); }
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。 /// <summary> /// <inheritdoc cref="ModuleLoader"/> /// </summary> /// <param name="services"></param> /// <param name="moduleTypes"></param> /// <param name="descriptorBuilder"></param> /// <param name="options"></param> public ModuleLoader(IServiceCollection services, IEnumerable <Type> moduleTypes, IModuleDescriptorBuilder descriptorBuilder, ModuleLoadOptions options) { Services = services ?? throw new ArgumentNullException(nameof(services)); _options = options ?? throw new ArgumentNullException(nameof(options)); if (moduleTypes.IsNullOrEmpty()) { throw new ArgumentNullException(nameof(moduleTypes)); } OrganizationModule(moduleTypes, descriptorBuilder); }