十二个 ASP.NET Core 例子——配置操作
目录:
- 简单配置(利用configration 键值读取)
- 使用选项和配置对象(自定义类绑定配置文件实现读取)
- IOptionsSnapshot(配置文件更改时也变化)
- 内存数据放到配置对象中
- 实体框架自定义配置
- CommandLine配置(利用命令行配置)
注:这是院子里面大神提供的例子。传送门
1.简单配置(利用configration 键值读取)
注意点多级节点用“:”冒号
public static IConfigurationRoot Configuration { get; set; }//吐槽没有开放出来。每次都要new public HomeController() { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); Configuration = builder.Build(); var value = Configuration["option1"];//一级节点 var value2 = Configuration["Logging:IncludeScopes"];//二级节点 var value3 = Configuration["Logging:LogLevel:Default"];//三级节点 var value4 = Configuration["Patients:1:Name"];//数据情况下,去第二个元素的第一节点 }
appsettings.json 文件
{ "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-AspNetCoreAuthIdentity-c52f1669-ef35-4a6f-af80-47f83d0b7b98;Trusted_Connection=True;MultipleActiveResultSets=true" }, "Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Warning" } }, "option1": "value1_from_json", "option2": 2, "Patients": [ { "Name": "Gandalf", "Age": "1000" }, { "Name": "Harry", "Age": "17" } ] }
2.使用选项和配置对象(自定义类绑定配置文件实现读取)
创建自己的类。
public class MyOptions { public MyOptions() { // Set default value. Option1 = "value1_from_ctor"; } public string Option1 { get; set; } public int Option2 { get; set; } = 5; }
项目启动时注入到配置中Services.Configure
public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddIdentity<ApplicationUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); services.AddMvc(); // Add application services. services.AddTransient<IEmailSender, AuthMessageSender>(); services.AddTransient<ISmsSender, AuthMessageSender>(); // Register the IConfiguration instance which MyOptions binds against. services.Configure<MyOptions>(Configuration); }
获取值
private readonly MyOptions _options; public HomeController(IOptions<MyOptions> options) { _options = options.Value; }
appsetting.json不用和类的字段完全一致,只要包含就可以了
3.IOptionsSnapshot(配置文件更改时也变化)
private readonly MyOptions _options; public HomeController(IOptionsSnapshot<MyOptions> options) { _options = options.Value; }
IOptionsSnapshot的作用:在配置文件修改的时候,配置数据也会变化。(刷新页面)
4.内存数据放到配置对象中(AddInMemoryCollection)
public static IConfigurationRoot Configuration { get; set; } public HomeController() { var dict = new Dictionary<string, string> { {"Profile:MachineName", "Rick"}, {"App:MainWindow:Height", "11"}, {"App:MainWindow:Width", "11"}, {"App:MainWindow:Top", "11"}, {"App:MainWindow:Left", "11"} }; var builder = new ConfigurationBuilder(); builder.AddInMemoryCollection(dict); Configuration = builder.Build(); var vlaue = Configuration["Profile:MachineName"]; }
顾名思义,不用去配置文件中读取,可以直接把内存中的数据放到配置对象中。【感觉有点没必要,既然在内存中,为什么不直接用】
这里还讲了一个GetValue<T>;作用:确定配置的值类型,设置默认值。用法:Configuration.GetValue<int>("App:MainWindow:Left", 80);
5.实体框架自定义配置(AddEntityFrameworkConfig)
利用EF读取数据库读取数据和写入数据。 类似利用EF 对数据库数据操作。
1.创建实体类 2.创建DbContext 3.创建自定义配置提供程序EFConfigProvider,4.创建资源给Provider,5.AddEntityFrameworkConfig 6.读取
代码较多操作较多就不贴了。。
6.CommandLine配置(AddCommandLine)命令行配置
先添加引用“Microsoft.Extensions.Configuration.CommandLine”
控制台类型下,添加命令行参数
public static IConfigurationRoot Configuration { get; set; } public static Dictionary<string, string> GetSwitchMappings( IReadOnlyDictionary<string, string> configurationStrings) { return configurationStrings.Select(item => new KeyValuePair<string, string>( "-" + item.Key.Substring(item.Key.LastIndexOf(':') + 1), item.Key)) .ToDictionary( item => item.Key, item => item.Value); } public static void Main(string[] args = null) { var dict = new Dictionary<string, string> { {"Profile:MachineName", "Rick"}, {"App:MainWindow:Left", "11"} }; var builder = new ConfigurationBuilder(); builder.AddInMemoryCollection(dict) .AddCommandLine(args, GetSwitchMappings(dict)); Configuration = builder.Build(); Console.WriteLine($"Hello {Configuration["Profile:MachineName"]}"); // Set the default value to 80 var left = Configuration.GetValue<int>("App:MainWindow:Left", 80); Console.WriteLine($"Left {left}"); Console.ReadKey(); }
注意:命令行参数有一定的格式,也可以利用GetSwitchMappings自定义格式。