/// <summary> /// 将Hybrid服务,各个<see cref="HybridModule"/>模块的服务添加到服务容器中 /// </summary> public static IServiceCollection AddHybrid <THybridModuleManager>(this IServiceCollection services, Action <IHybridBuilder> builderAction = null) where THybridModuleManager : IHybridModuleManager, new() { Check.NotNull(services, nameof(services)); IConfiguration configuration = services.GetConfiguration(); Singleton <IConfiguration> .Instance = configuration; services.AddOptions(); //services.ConfigureAndValidate<HybridOptions>("Hybrid", Configuration); services.ConfigureAndValidateHybridOption <HybridOptions>(configuration); //初始化所有程序集查找器 services.TryAddSingleton <IAllAssemblyFinder>(new AppDomainAllAssemblyFinder()); IHybridBuilder builder = services.GetSingletonInstanceOrNull <IHybridBuilder>() ?? new HybridBuilder(); builderAction?.Invoke(builder); services.TryAddSingleton <IHybridBuilder>(builder); THybridModuleManager manager = new THybridModuleManager(); services.AddSingleton <IHybridModuleManager>(manager); manager.LoadModules(services); services.TryAddSingleton <IHybridStartupConfiguration, HybridStartupConfiguration>(); return(services); }
/// <summary> /// 加载模块服务 /// </summary> /// <param name="services">服务容器</param> /// <returns></returns> public virtual IServiceCollection LoadModules(IServiceCollection services) { IHybridModuleTypeFinder moduleTypeFinder = services.GetOrAddTypeFinder <IHybridModuleTypeFinder>(assemblyFinder => new HybridModuleTypeFinder(assemblyFinder)); Type[] moduleTypes = moduleTypeFinder.FindAll(); _sourceModules.Clear(); _sourceModules.AddRange(moduleTypes.Select(m => (HybridModule)Activator.CreateInstance(m))); IHybridBuilder builder = services.GetSingletonInstance <IHybridBuilder>(); List <HybridModule> modules; if (builder.AddModules.Any()) { modules = _sourceModules.Where(m => m.Level == ModuleLevel.Core) .Union(_sourceModules.Where(m => builder.AddModules.Contains(m.GetType()))).Distinct() .OrderBy(m => m.Level).ThenBy(m => m.Order).ToList(); List <HybridModule> dependModules = new List <HybridModule>(); foreach (HybridModule module in modules) { Type[] dependModuleTypes = module.GetDependModuleTypes(); foreach (Type dependModuleType in dependModuleTypes) { HybridModule dependModule = _sourceModules.Find(m => m.GetType() == dependModuleType); if (dependModule == null) { throw new HybridException($"加载模块{module.GetType().FullName}时无法找到依赖模块{dependModuleType.FullName}"); } dependModules.AddIfNotExist(dependModule); } } modules = modules.Union(dependModules).Distinct().ToList(); } else { modules = _sourceModules.ToList(); modules.RemoveAll(m => builder.ExceptModules.Contains(m.GetType())); } // 按先层级后顺序的规则进行排序 modules = modules.OrderBy(m => m.Level).ThenBy(m => m.Order).ToList(); LoadedModules = modules; foreach (HybridModule module in LoadedModules) { services = module.AddServices(services); } return(services); }
/// <summary> /// 添加CoreModule /// </summary> public static IHybridBuilder AddCoreModule(this IHybridBuilder builder) { return(builder.AddModule <HybridCoreModule>()); }