如果您想让启动文件的“绑定”部分保持简洁,可以在
IConfiguration
或
IServiceCollection
会有用的。下面是一个基本的实现。
static class ConfigurationBindingExtensions
{
public static void BindSection<T>(this IConfiguration configuration, IServiceCollection services, string sectionName) where T : class
{
var config = configuration.GetSection(sectionName);
if (config.Exists())
{
services.Configure<T>(config);
}
else
{
throw new ConfigurationSectionNotFoundException(sectionName);
}
}
}
[Serializable]
class ConfigurationSectionNotFoundException : Exception, System.Runtime.Serialization.ISerializable
{
public string SectionName { get; set; }
public ConfigurationSectionNotFoundException(string sectionName)
: this(sectionName, string.Format("Section {0} was not found in the configuration file", sectionName))
{
this.SectionName = sectionName;
}
public ConfigurationSectionNotFoundException(string sectionName, string message)
: base(message)
{
this.SectionName = sectionName;
}
protected ConfigurationSectionNotFoundException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
: base(info, context)
{
if (info == null)
throw new ArgumentNullException(nameof(info));
SectionName = info.GetString("SectionName");
}
[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, SerializationFormatter = true)]
public override void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
{
if (info == null)
throw new ArgumentNullException(nameof(info));
info.AddValue("SectionName", SectionName);
base.GetObjectData(info, context);
}
[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.LinkDemand, Flags = System.Security.Permissions.SecurityPermissionFlag.SerializationFormatter)]
void System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
{
if (info == null)
throw new ArgumentNullException(nameof(info));
GetObjectData(info, context);
}
}
你会这样称呼它:
Configuration.BindSection<FooBarOptions>(services, "FooBar");
如果未定义节,这将引发自定义异常——如果对您更有意义,您可以用其他内容替换它。可能是杀伤力太大了,但它能保持启动。漂亮整洁。