配置绑定
本节学习,配置绑定---使用强类型对象承载配置数据,这样做的目的是为了更方便的管理配置对象。因为,这意味着,我们可以直接从对象来查看配置的信息。如下,我们有一个json配置文件
{ "key1": "value1", "key2": 0, "Section1": { "key3": "value3", "key4": 10, "key5": true } }
我们先定义一个用来承载配置的类,将其定义为ConfigModel
class ConfigModel { public String key1 { get; set; } public int key2 { get; set; } public int key4 { get; set; } public bool key5 { get; private set; } = false; }
首先,我们利用文件提供程序类型来加载配置
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); configurationBuilder.AddJsonFile("settings.json"); IConfigurationRoot configurationRoot = configurationBuilder.Build();
配置绑定我们通过Bind方法,如下,我们给ConfigModel来赋值初始值,以便与最后的结果做比较
ConfigModel configModel = new ConfigModel() { key1 = "value1new", key2 = 10 ,key4=30}; //可以进行对此绑定,应该还可以绑定到不同的对象。 configurationRoot.Bind(configModel);
我们可以同时将配置绑定到多个对象,比如,我们可能加载了多个配置文件,或者以配置文件的多个Section等来区分,我们可以进行多次绑定
ConfigModel configModel = new ConfigModel() { key1 = "value1new", key2 = 10 ,key4=30}; //可以进行对此绑定,应该还可以绑定到不同的对象。 configurationRoot.Bind(configModel); //获取节,并绑定 configurationRoot.GetSection("Section1").Bind(configModel); //...
私有变量/方法的处理
如上,ConfigModel中的key5的set方法是private的,也就意味着,我们在类外部无法直接调用其set方法,那么,我们该如何将配置文件中的值赋值到类呢?
这里,我们需要用到BinderOptions。Bind()带有第二个参数BinderOptions,可以让我们指定绑定选项。如我们要给key5赋值
configurationRoot.GetSection("Section1").Bind(configModel,options=> { options.BindNonPublicProperties = true; });
这里options.BindNonPublicProperties = true代表我们允许绑定私有属性。
这样我们就可以获取到私有变量的值了。
其实,在实际的开发过程中,我们一般都会用类来承载我们的配置,因为这样,不仅可以更直观的了解配置,而且便于对配置进行管理。下面一节,学习如何低成本实现自定义的配置源。
源码可访问
https://github.com/IronMarmot/Samples/tree/master/CoreSamples