[Abp vNext 源码分析] - 11. 用户的自定义参数与配置
一、简要说明
第二个我们已经看过,是在模块启动时有用到。第一个则是有一个 SettingDefinitionManager
,顾名思义就是管理所有的 SettingDefinition
的管理器。这个管理器提供了三个方法,都是针对 SettingDefinition
的查询功能。
public interface ISettingDefinitionManager { // 根据参数定义的标识查询,不存在则抛出 AbpException 异常。 [NotNull] SettingDefinition Get([NotNull] string name); // 获得所有的参数定义。 IReadOnlyList<SettingDefinition> GetAll(); // 根据参数定义的标识查询,如果不存在则返回 null。 SettingDefinition GetOrNull(string name); }
接下来我们看一下它的默认实现 SettingDefinitionManager
,它的内部没什么说的,只是注意 SettingDefinitions
的填充方式,这里使用了线程安全的 懒加载模式。只有当用到的时候,才会调用 CreateSettingDefinitions()
方法填充数据。
public class SettingDefinitionManager : ISettingDefinitionManager, ISingletonDependency { protected Lazy<IDictionary<string, SettingDefinition>> SettingDefinitions { get; } protected AbpSettingOptions Options { get; } protected IServiceProvider ServiceProvider { get; } public SettingDefinitionManager( IOptions<AbpSettingOptions> options, IServiceProvider serviceProvider) { ServiceProvider = serviceProvider; Options = options.Value; // 填充的时候,调用 CreateSettingDefinitions 方法进行填充。 SettingDefinitions = new Lazy<IDictionary<string, SettingDefinition>>(CreateSettingDefinitions, true); } // ... protected virtual IDictionary<string, SettingDefinition> CreateSettingDefinitions() { var settings = new Dictionary<string, SettingDefinition>(); using (var scope = ServiceProvider.CreateScope()) { // 从 Options 中得到类型,然后通过 IoC 进行实例化。 var providers = Options .DefinitionProviders .Select(p => scope.ServiceProvider.GetRequiredService(p) as ISettingDefinitionProvider) .ToList(); // 执行每个 Provider 的 Define 方法填充数据。 foreach (var provider in providers) { provider.Define(new SettingDefinitionContext(settings)); } } return settings; } }
参数值的管理
获取参数值#
直奔主题,来看一下 ISettingProvider.GetOrNullAsync(string)
方法是怎么来获取参数值的。