前言
ASP.NET Core 后我們的配置變得更加輕量級了,在ASP.NET Core中,配置模型得到了顯著的擴展和增強,應用程式配置可以存盤在多環境變數配置中,appsettings.json用戶機密等 并可以通過應用程式中的相同界面輕松訪問,除此之外,ASP.NET中的新配置系統允許使用Options的強型別設定,
強型別Options
在ASP.NET Core中沒有AppSettings["Key"]默認方法,那么推薦的是創建強型別的配置類,去系結配置項,
public class MyOptions
{
public string Name { get; set; }
public string Url { get; set; }
}
然后我們在appsettings.json中添加如下內容:
{
"MyOptions":
{
"Name": "TestName",
"Url": "TestUrl"
}
}
配置系結到類
ConfigureServices方法進行配置以系結到類
public void ConfigureServices(IServiceCollection services)
{
services.Configure<MyOptions>(Configuration.GetSection("MyOptions"));
services.AddControllers();
}
MyOptions只需將IOptions<>類的實體注入控制器中,然后通過Value屬性獲取Myoptions:
public class WeatherForecastController : ControllerBase
{
private readonly MyOptions _options;
public WeatherForecastController(IOptions<MyOptions> options)
{
_options = options.Value;
}
[HttpGet]
public OkObjectResult Get() {
return Ok(string.Format("Name:{0},Url:{1}", _options.Name,_options.Url));
}
}
Configure
委托配置
//基礎注冊方式
services.Configure<MyOptions>(o => { o.Url = "MyOptions"; o.Name = "Name111"; });
//指定具體名稱
services.Configure<MyOptions>("Option", o => { o.Url = "MyOptions"; o.Name = "Name111"; }) ;
//配置所有實體
services.ConfigureAll<MyOptions>(options =>{ options.Name = "Name1"; options.Url = "Url1";});
通過組態檔配置
// 使用組態檔來注冊實體
services.Configure<MyOptions>(Configuration.GetSection("MyOptions"));
// 指定具體名稱
services.Configure<MyOptions>("Option", Configuration.GetSection("MyOptions"));
PostConfigure
PostConfigure會在Configure注冊完之后再進行注冊
services.PostConfigure<MyOptions>(o => o.Name = "Name1");
services.PostConfigure<MyOptions>("Option", o => o.Name = "Name1");
services.PostConfigureAll<MyOptions>(o => o.Name = "Name1");
原始碼決議
IConfigureOptions介面
public interface IConfigureOptions<in TOptions> where TOptions : class
{
void Configure(TOptions options);
}
Configure為方便使用IConfigureOptions注冊單例ConfigureNamedOptions
public static IServiceCollection Configure<TOptions>(this IServiceCollection services, string name, Action<TOptions> configureOptions)
where TOptions : class
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
if (configureOptions == null)
{
throw new ArgumentNullException(nameof(configureOptions));
}
services.AddOptions();
services.AddSingleton<IConfigureOptions<TOptions>>(new ConfigureNamedOptions<TOptions>(name, configureOptions));
return services;
}
上面代碼IConfigureOptions實作了ConfigureNamedOptions,那我們再來看看內部原始碼
ConfigureNamedOptions 其實就是把我們注冊的Action包裝成統一的Configure方法,以方便后續創建Options實體時,進行初始化,
public class ConfigureNamedOptions<TOptions> : IConfigureNamedOptions<TOptions> where TOptions : class
{
public ConfigureNamedOptions(string name, Action<TOptions> action)
{
Name = name;
Action = action;
}
public string Name { get; }
public Action<TOptions> Action { get; }
public virtual void Configure(string name, TOptions options)
{
if (options == null)
{
throw new ArgumentNullException(nameof(options));
}
// Null name is used to configure all named options.
if (Name == null || name == Name)
{
Action?.Invoke(options);
}
}
public void Configure(TOptions options) => Configure(Options.DefaultName, options);
}
在 services.Configure
public virtual void Configure(string name, TOptions options)
{
if (options == null)
{
throw new ArgumentNullException(nameof(options));
}
// Null name is used to configure all named options.
if (Name == null || name == Name)
{
Action?.Invoke(options);
}
}
public void Configure(TOptions options) => Configure(Options.DefaultName, options);
默認使用的是Options.DefaultName
AddOptions默認方法默認為我們注冊了一些核心的類
public static IServiceCollection AddOptions(this IServiceCollection services)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptions<>), typeof(OptionsManager<>)));
services.TryAdd(ServiceDescriptor.Scoped(typeof(IOptionsSnapshot<>), typeof(OptionsManager<>)));
services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptionsMonitor<>), typeof(OptionsMonitor<>)));
services.TryAdd(ServiceDescriptor.Transient(typeof(IOptionsFactory<>), typeof(OptionsFactory<>)));
services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptionsMonitorCache<>), typeof(OptionsCache<>)));
return services;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/83018.html
標籤:.NET Core
上一篇:Asp.net Core 3.0 Identity 使用smtp賬戶確認和密碼恢復
下一篇:.NET Core的回應式框架,基于Ace Admin框架選單導航,Bootstrap布局,fontAwesome圖示,內嵌Iframe用EasyUI做資料系結,動態配置串列,動態配置表單
