Asp.net Core Configuration

本文深入探讨了ASP.NET Core中的配置机制,详细分析了IConfigurationBuilder接口及其默认实现ConfigurationBuilder类,介绍了如何通过添加配置源构建配置树,并最终生成ConfigurationRoot实例的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

asp.net core 源码学习笔记(配置部分)

  • 接口 IConfigurationBuilder
  • 实现类 ConfigurationBuilder

    我们都知道 .net Core 下面配置配置 是通过创建 IconfigurationBuilder 对象,下面来看 IconfigurationBuilder 的默认实现

    public class ConfigurationBuilder : IConfigurationBuilder
    {
        public IList<IConfigurationSource> Sources { get; } = new List<IConfigurationSource>();
        
        public IConfigurationBuilder Add(IConfigurationSource source)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            Sources.Add(source);
            return this;
        }
        
        public IConfigurationRoot Build()
        {
            var providers = new List<IConfigurationProvider>();
            foreach (var source in Sources)
            {
                var provider = source.Build(this);
                providers.Add(provider);
            }
            return new ConfigurationRoot(providers);
        }
    }

ConfigurationBuilder 对象中调用的所有Add**扩展方法都是 调用的该类中的Add方法该方法为 Builder() 函数提供数据源

下面我们再来看Builder() 函数 返回一个ConfigurationRoot 对象(该对象是IConfiguration的实现类)。 通过IConfigurationSource 的Build() 函数 构建IConfigurationProvider 对象 -具体实现1 如下

public class MemoryConfigurationSource : IConfigurationSource
    {
        public IEnumerable<KeyValuePair<string, string>> InitialData { get; set; }
        
        public IConfigurationProvider Build(IConfigurationBuilder builder)
        {
            return new MemoryConfigurationProvider(this);
        }
    }

同时对于IConfigurationProvider 接口提供了抽象的基础实现ConfigurationProvider 具体实现1 如下

public class MemoryConfigurationProvider : ConfigurationProvider, IEnumerable<KeyValuePair<string, string>>
    {
        private readonly MemoryConfigurationSource _source;

        public MemoryConfigurationProvider(MemoryConfigurationSource source)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            _source = source;

            if (_source.InitialData != null)
            {
                foreach (var pair in _source.InitialData)
                {
                    Data.Add(pair.Key, pair.Value);
                }
            }
        }
    }
  • 基类实现
public abstract class ConfigurationProvider : IConfigurationProvider
    {
        private ConfigurationReloadToken _reloadToken = new ConfigurationReloadToken();

        protected ConfigurationProvider()
        {
            Data = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
        }

        protected IDictionary<string, string> Data { get; set; }

        public virtual bool TryGet(string key, out string value)
            => Data.TryGetValue(key, out value);

        public virtual void Set(string key, string value)
            => Data[key] = value;

        public virtual void Load()
        { }
       

        public IChangeToken GetReloadToken()
        {
            return _reloadToken;
        }

 
        protected void OnReload()
        {
            var previousToken = Interlocked.Exchange(ref _reloadToken, new ConfigurationReloadToken());
            previousToken.OnReload();
        }

        public override string ToString() => $"{GetType().Name}";
    }
}

最后返回的ConfigurationRoot 就是我们常用的IConfiguration
至于我们用的IConfigurationSection 实际上就是对ConfigurationRoot的封装
993168-20190301153202893-2124645485.png

详细源码见 https://github.com/aspnet/Extensions

转载于:https://www.cnblogs.com/becomechapter/p/10456701.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值