上一篇介绍了.net core的配置原理已经系统提供的一些常用的配置,但有时我们的配置是存放在Zookeeper,DB,Redis中的,这就需要我们自己去实现集成了。

  这里再介绍几个我们用的多的配置集成方案,可以加强我们对.net core配置机制的理解。

  

  Zookeeper

  .net core集成使用Zookeeper的做法在之前的博客中已经介绍过了,祥看:Zookeeper基础教程(六):.net core使用Zookeeper

 

  通用配置

  对于配置,数量一般不会很多,放在内存中一般时候是可以接受的,这样一方面方便使用,另一方面避免了频繁访问数据库或者Redis等第三方设置带来的性能消耗。

  其实,对于数据在数据库或者redis等其他存储设备上的集成,官方给我们提供了一个InMemory解决方案,也就是上一篇说到的从内存集合中获取配置的方案。在使用时,我们只需要在程序启动时从数据库或者Redis等位置将数据读取出来,然后已InMemory的方式集成进去就行了。但是这样做有个不足,就是当配置被修改时,我们需要重新启动应用服务才能生效,这样就是放弃了.net core配置重新加载机制,因此我们需要自己去实现这个集成。

  通过上述,我们可以认为数据库和Redis是同一类东西,但是又不能使用InMemory解决方案,因此,为满足以后的其它第三方配置需求,我们希望有一种通用的配置提供者,它需要满足两点:  

    1、提供配置所需的数据
    2、能触发配置的重新加载更新

  为满足这两点,我们可以提供一个接口,如:  

    public interface IDataProvider
    {
        /// <summary>
        /// 获取配置数据
        /// </summary>
        /// <returns></returns>
        IDictionary<string, string> Process();
        /// <summary>
        /// 开启监听,决定什么时候触发重新加载配置
        /// </summary>
        /// <param name="trigger"></param>
        void Watch(Action trigger);
    }

  在上一篇我们已经讲到,集成配置需要我们自己实现两个接口:IConfigurationSource 和 IConfigurationProvider 。另外还提到,如果我们的配置来自其它文件,推荐分别继承 FileConfigurationSource 和 FileConfigurationProvider 两个抽象类,否则推荐自己实现 IConfigurationSource 接口,但是 IConfigurationProvider 接口的实现类继承 ConfigurationProvider 抽象类,显然数据库和Redis之类的都不是文件,于是我们可以有这样两个实现类:  

  
    public class CommonConfigurationSource : IConfigurationSource
    {
        public Type DataProviderType { get; set; }
        /// <summary>
        /// 是否监控源数据变化
        /// </summary>
        public bool ReloadOnChange { get; set; } = true;
        /// <summary>
        /// 加载延迟
        /// </summary>
        public int ReloadDelay { get; set; } = 250;

        public IConfigurationProvider Build(IConfigurationBuilder builder)
        {
            if (!typeof(IDataProvider).IsAssignableFrom(DataProviderType))
            {
                throw new ArgumentException("Data Provider Type must implement IDataProvider");
            }

            return new CommonConfigurationProvider(this);
        }
    }
CommonConfigurationSource

相关文章: