/// <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);
        }
Exemple #2
0
        /// <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);
        }
Exemple #3
0
 /// <summary>
 /// 添加CoreModule
 /// </summary>
 public static IHybridBuilder AddCoreModule(this IHybridBuilder builder)
 {
     return(builder.AddModule <HybridCoreModule>());
 }