配置管理单元


  光在配置文件里写了没用,关键你得将配置读出来为你所用,因此 ConfigurationUnity 类就扛了这件事。


1、GetSection 方法

  GetSection 是一个泛型方法,泛型参数即配置节的实现类,它用来从配置文件里读出某一组件的配置项。如(使用了上节的配置文件):

[TestMethod]
public void TestGetSection()
{
    var section = ConfigurationUnity.GetSection<LoggingConfigurationSection>();
    Assert.AreEqual(2, section.Settings.Count);
    Assert.AreEuqal("nlog", section.DefaultInstanceName);
}

2、Bind 方法

  用于 .Net Core 中初始化时绑定 IConfiguration 对象。在 .Net Core 程序的配置中,Startup.ConfigureServices 方法里使用了 AddFireasy 方法,它负责从 configuration 里读取配置并绑定到各组件库的各类配置节上。如下所示:

namespace demo
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddFireasy(Configuration);
        }
    }
}

  AddFireasy 方法会遍列你所引用的程序集,它会优先检查程序集有没有使用 ConfigurationBinderAttribute 来标记,如果有的话,使用 BinderType 绑定的类型去调用静态方法 Bind 绑定配置。 否则会在程序集里查找 Microsoft.Extensions.DependencyInjection.ConfigurationBinder 类型,调用静态方法 Bind 绑定配置。


3、CreateInstance 方法

  用于通过配置荐创建一个实例对象。如下所示,通过配置创建一个 ILogger 实例:

[TestMethod]
public void TestCreateLogger()
{
    var section = ConfigurationUnity.GetSection<LoggingConfigurationSection>();
    var setting = section.Default;
    var logger = ConfigurationUnity
        .CreateInstance<LoggingConfigurationSetting, ILogger>(null, setting, s => s.LogType);
    Assert.IsNotNull(logger);
}

  第一个参数是 IServiceProvider 类型,如果传递的是非空对象,则在创建实例的时候,它会使用 IServiceProvider 的 GetService 方法从 IOC 里注入构造函数里的参数对象。


4、Cached 方法

  用于缓存一个通过配置荐创建的实例对象。如下所示:

[TestMethod]
public void TestCachedLogger()
{
    var section = ConfigurationUnity.GetSection<LoggingConfigurationSection>();
    var setting = section.Default;
    var logger = ConfigurationUnity.Cached<ILogger>(
        $"Logger_{setting.Name}", null,
        () => ConfigurationUnity.
            CreateInstance<LoggingConfigurationSetting, ILogger>(null, setting, s => s.LogType));
    Assert.IsNotNull(logger);
}

  第二个参数是 IServiceProvider 类型,如果传递的是非空对象,则实例不会被缓存。