コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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);
        }