配置管理单元
光在配置文件里写了没用,关键你得将配置读出来为你所用,因此 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
类型,如果传递的是非空对象,则实例不会被缓存。