public void LoadFromStorage(IServiceCollection services)
        {
            //从持久化存储中查询所有配置信息
            var list = _storageProvider.GetAll();

            foreach (var descriptor in _moduleOptionsCollection)
            {
                var options = (IModuleOptions)_serviceProvider.GetService(descriptor.OptionsType);
                foreach (var definition in descriptor.Definitions)
                {
                    var val = list.FirstOrDefault(m => m.Key.EqualsIgnoreCase(definition.Key));
                    if (val != null)
                    {
                        try
                        {
                            SetValue(options, definition.PropertyInfo, val.Value);
                        }
                        catch (Exception ex)
                        {
                            _logger.LogError("加载模块配置错误:{@ex}", ex);
                        }
                    }
                }

                services.Remove(services.FirstOrDefault(m => m.ServiceType == descriptor.OptionsType));

                services.AddSingleton(descriptor.OptionsType, options);
            }
        }
Exemple #2
0
        public void Load(IServiceCollection services)
        {
            if (_moduleCollection != null)
            {
                _logger.LogInformation("加载所有配置项");

                //查询所有
                var list = _storageProvider.GetAll().GetAwaiter().GetResult();

                foreach (var module in _moduleCollection)
                {
                    _logger.LogInformation("刷新配置项:{@name}", module.Name);

                    //一个模块中只能有一个配置项,且必须按照“模块名称+Options”的命名方式
                    var optionsType = module.AssemblyDescriptor.Infrastructure.GetTypes()
                                      .FirstOrDefault(m => typeof(IModuleOptions).IsAssignableFrom(m) && m.Name.EqualsIgnoreCase($"{module.Id}Options"));

                    if (optionsType != null)
                    {
                        var properties = optionsType.GetProperties().Where(m => m.GetCustomAttributes(false).Any(n => n.GetType() == typeof(ModuleOptionDefinitionAttribute)));
                        var options    = (IModuleOptions)Activator.CreateInstance(optionsType);

                        //绑定系统配置对象
                        var systemConfigProperty = optionsType.GetProperties().FirstOrDefault(m => m.PropertyType == typeof(SystemConfigModel));
                        if (systemConfigProperty != null)
                        {
                            systemConfigProperty.SetValue(options, _systemConfig);
                        }

                        //配置项定义信息列表
                        var definitionList = new List <ModuleOptionDefinitionAttribute>();

                        foreach (var property in properties)
                        {
                            var key = optionsType.FullName + "." + property.Name;
                            var val = list.FirstOrDefault(m => m.Key.EqualsIgnoreCase(key));
                            if (val != null)
                            {
                                try
                                {
                                    property.SetValue(options, Convert.ChangeType(val.Value, property.PropertyType));
                                }
                                catch (Exception ex)
                                {
                                    _logger.LogError("加载模块配置错误:{@ex}", ex);
                                }
                            }

                            var definition = GetDefinition(property);
                            if (definition != null)
                            {
                                definitionList.Add(definition);

                                AllDefinitionList.Add(key, definition);
                            }
                        }

                        ModuleOptionsDefinitionList.Add(module.Id, definitionList);

                        services.AddSingleton(options);
                        services.AddSingleton(optionsType, options);
                    }
                }
            }
        }