ASP.NET Core的配置(3): 将配置绑定为对象[下篇]
我们在《读取配置信息》通过实例的形式演示了如何利用Options模型以依赖注入的方式直接获取由指定配置节绑定生成的Options对象,我们再次回顾一下当初我们编写的程序。如下面的代码片段所示,基于Options模型的配置绑定的编程基本采用这样的模式:先后调用ServiceCollection的扩展方法AddOption和Configure注册Options模型相关的服务并完成Options类型与指定配置节之间的映射,然后利用由此生成ServiceProvider获得一个类型为IOptions
1: FormatSettings settings = new ServiceCollection()
2: .AddOptions()
3: .Configure(configuration)
4: .BuildServiceProvider()
5: .GetService>()
6: .Value;
一、IOptions
由于Options模型的编程仅仅涉及到上述几个方法的调用,所以只要搞清楚这几个方法背后的实现逻辑,我们也就彻底了解了Options模型的实现原理。首先当我们调用ServiceCollection的扩展方法时,实际上仅仅是按照如下的方式注册了一个针对IOptions
1: public static class ServiceCollectionExtensions
2: {
3: public static IServiceCollection AddOptions(this IServiceCollection services)
4: {
5: return services.AddSingleton(typeof(IOptions<>), typeof(OptionsManager<>));
6: }
7: }
8:
9: public interface IOptionswhere TOptions:class, new()
10: {
11: TOptions Value { get; }
12: }
通过上面的给出的代码片段我们不难看出,AddOptions方法实际上是以Singleton模式注册了一个类型为OptionsManager
1: public class OptionsManager: IOptions where TOptions : class, new()
2: {
3: private LazyoptionsAccessor;
4: public OptionsManager(IEnumerable> setups)
5: {
6: optionsAccessor = new Lazy(() =>
7: {
8: TOptions options = new TOptions();
9: setups.ForEach(it => it.Configure(options));
10: return options;
11: });
12: }
13: public TOptions Value
14: {
15: get { return optionsAccessor.Value; }
16: }
17: }
二、IConfigureOptions
IConfigureOptions
1: public interface IConfigureOptionswhere TOptions : class, new()
2: {
3: void Configure(TOptions options);
4: }
5:
6: public class ConfigureOptions: IConfigureOptions where TOptions : class, new()
7: {
8: public ActionAction { get; private set; }
9: public ConfigureOptions(Actionaction)
10: {
11: this.Action = action;
12: }
13: public void Configure(TOptions options)
14: {
15: this.Action(options);
16: }
17: }
针对Options对象的配置绑定工作实现在一个名为ConfigureFromConfigurationOptions
1: public class ConfigureFromConfigurationOptions: ConfigureOptions where TOptions : class, new()
2: {
3: public ConfigureFromConfigurationOptions(IConfiguration configuration) : base(options => configuration.Bind(options))
4: { }
5: }
在Options模型中,ConfigureFromConfigurationOptions
1: public static class ServiceCollectionExtensions
2: {
3: public static IServiceCollection Configure(this IServiceCollection services, IConfiguration configuration)
4: where TOptions : class, new()
5: {
6: return services.AddInstance>(new ConfigureFromConfigurationOptions (configuration));
7: }
8: }
三、Options对象的提供
整个Options模型以两个注册到ServiceCollection的服务为核心,这两个服务对应的服务接口分别是IOptions
对于一个包含服务注册描述信息的ServiceCollection,当我们分别调用其扩展方法AddOptions和Configure完成了相应的服务注册之后,我们就可以利用由它生成的ServiceProvider对象来提供针对接口类型IOptions
ServiceProvider提供的这个服务实例自然是一个OptionsManager
ASP.NET Core的配置(1):读取配置信息
ASP.NET Core的配置(2):配置模型详解
ASP.NET Core的配置(3): 将配置绑定为对象[上篇]
ASP.NET Core的配置(3): 将配置绑定为对象[下篇]
ASP.NET Core的配置(4):多样性的配置源[上篇]
ASP.NET Core的配置(4):多样性的配置源[中篇]
ASP.NET Core的配置(4):多样性的配置源[下篇]
ASP.NET Core的配置(5):配置的同步[上篇]
ASP.NET Core的配置(5):配置的同步[下篇]