问题

如何在 ASP.NET Core 2.0 应用程序中读取全局配置项?

答案

首先新建一个空项目,并添加两个配置文件:

1. appsettings.json

{"Section1": {"SettingA": "ValueA","SettingB": "ValueB"},"Section2": {"SettingC": "ValueC"}
}

2. appsettings.Development.json

{"Section1": {"SettingA": "Dev_ValueA"},"Section2": {"SettingC": "Dev_ValueC"}
}

Visual Studio会自动识别两者的关系,并在解决方案层次结构中展示如下:

然后创建相应的POCO类,分别对应于几个配置节点:

public class AppSettings
{public AppSettingsSection1 Section1 { get; set; }public AppSettingsSection2 Section2 { get; set; }
}public class AppSettingsSection1
{public string SettingA { get; set; }public string SettingB { get; set; }
}public class AppSettingsSection2
{public string SettingC { get; set; }
}

在Startup.cs文件中,创建接收 IConfiguration 的构造函数:

public static IConfiguration Configuration { get; private set;}public Startup(IConfiguration config)
{Configuration = config;
}

然后在 ConfigureServices() 方法中添加Options服务,并设置依赖项:

public void ConfigureServices(IServiceCollection services)
{services.AddOptions();services.Configure<AppSettings>(Configuration);
}

最后,将配置项作为IOptions接口注入中间件的构造函数,其中泛型类型T就是我们刚才定义的POCO类:

public class HelloWorldMiddleware
{private readonly RequestDelegate _next;private readonly AppSettings _settings;public HelloWorldMiddleware(RequestDelegate next, IOptions<AppSettings> options){_next = next;_settings = options.Value;}public async Task Invoke(HttpContext context){var jsonSettings = JsonConvert.SerializeObject(_settings, Formatting.Indented);await context.Response.WriteAsync(jsonSettings);}
}public static class UseHelloWorldInClassExtensions
{public static IApplicationBuilder UseHelloWorld(this IApplicationBuilder app){return app.UseMiddleware<HelloWorldMiddleware>();}
}

在Startup.cs的 Configure() 方法中,将此中间件注入到请求管道中:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{app.UseHelloWorld();
}

运行,此时页面显示:

讨论

ASP.NET Core 拥有一个简单的机制来从各种数据源(比如JSON文件,环境变量,甚至是自定义数据源)中读取应用程序设置。然后通过依赖注入,方便的使用这些配置项。

尽管这一切看起来很魔幻(我们的设置究竟是如何加载的!),ASP.NET Core 2.0隐藏了从数据源中读取配置项的细节,这些内容本应该存在于Program.cs文件中WebHost的CreateDefaultBuilder()方法中。IConfiguration随后被添加到服务容器中,并在应用程序的其他部分保持可用,我们使用Startup中的此接口来添加配置项。为了观察这个过程,请将Program.cs文件中的BuildWebHost()方法替换为如下内容,得到的结果是一样的:

public static IWebHost BuildWebHost(string[] args) =>WebHost.CreateDefaultBuilder(args).UseStartup<Startup>().ConfigureAppConfiguration((context, builder) =>{var env = context.HostingEnvironment;builder.AddJsonFile("appsettings.json",optional: true, reloadOnChange: true).AddJsonFile($"appsettings.{env.EnvironmentName}.json",optional: true, reloadOnChange: true);if (env.IsDevelopment()){var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));if (appAssembly != null){builder.AddUserSecrets(appAssembly, optional: true);}}builder.AddEnvironmentVariables();if (args != null){builder.AddCommandLine(args);}}).Build();

在上面的解决方案中,我们提供了两个JSON文件数据源。需要记着的一点是,这些文件按照顺序被依次读取,后面的数据源会覆盖前面的数据源。你也可以在上面的运行结果中注意到,SettingB配置项来自于第一个配置文件,而其他两个配置项都来自于第二个配置文件。

注意:Startup.cs中的IConfiguration实例拥有public static修饰符,因此可以在整个应用程序期间使用此实例:

var valueA = Config["Section1:SettingA"];

然而,更好的办法是将配置项读入一个类型化的POCO类,并将其作为依赖项注入中间件或者控制器。上面的示例正好展示了这个模式。

你也可以为不同的配置节定义不同的POCO类,并使用IConfiguration的GetSection()方法来读取。

====start by sanshi=========================

下面我们简单扩展之前的示例,来读取不同的配置节:

public void ConfigureServices(IServiceCollection services)
{services.AddOptions();services.Configure<AppSettings>(Configuration);services.Configure<AppSettingsSection1>(Configuration.GetSection("Section1"));
}

更新中间件代码,此时向中间件的构造函数注入两个依赖项:

public class HelloWorldMiddleware
{private readonly RequestDelegate _next;private readonly AppSettings _settings;private readonly AppSettingsSection1 _settingsSection1;public HelloWorldMiddleware(RequestDelegate next, IOptions<AppSettings> options, IOptions<AppSettingsSection1> optionsSection1){_next = next;_settings = options.Value;_settingsSection1 = optionsSection1.Value;}public async Task Invoke(HttpContext context){var jsonSettings = JsonConvert.SerializeObject(_settings, Formatting.Indented);var jsonSettingsSection1 = JsonConvert.SerializeObject(_settingsSection1, Formatting.Indented);await context.Response.WriteAsync("AppSettings:\n" + jsonSettings + "\n\nAppSettings - Section1:\n" + jsonSettingsSection1);}
}

运行,此时页面显示:

====end by sanshi=========================

当然,我们也可以手工设置配置项的值,通过使用IServiceCollection.Configure的重载方法并接收强类型的lambda表达式:

====start by sanshi=========================

修改ConfigurationServices()方法,手工设置配置项:

public void ConfigureServices(IServiceCollection services)
{services.AddOptions();services.Configure<AppSettings>(options =>{options.Section1 = new AppSettingsSection1();options.Section1.SettingA = "SettingA Value";options.Section1.SettingB = "SettingB Value";});
}

运行,此时页面效果:

====end by sanshi=========================

源代码下载

原文:https://tahirnaushad.com/2017/08/15/asp-net-core-configuration/

[译]ASP.NET Core 2.0 全局配置项相关推荐

  1. [译]ASP.NET Core 2.0 机密配置项

    问题 如何在ASP.NET Core 2.0中保存机密配置项(不用将其暴露给源代码管理器)? 答案 创建一个ASP.NET Core 2.0空项目,在项目节点上点击右键,并点击菜单项 - 管理用户机密 ...

  2. ASP.NET Core 2.0 全局配置项

    问题 如何在 ASP.NET Core 2.0 应用程序中读取全局配置项? 答案 首先新建一个空项目,并添加两个配置文件: 1. appsettings.json { "Section1&q ...

  3. [译]ASP.NET Core 2.0 部分视图

    问题 如何在ASP.NET Core 2.0中使用部分视图来重用页面的公共部分? 答案 新建一个空项目,在Startup中添加MVC服务和中间件: public void ConfigureServi ...

  4. [译]ASP.NET Core 2.0 网址重定向

    问题 如何在ASP.NET Core 2.0中实现网址重定向? 答案 新建一个空项目,在Startup.cs文件中,配置RewriteOptions参数并添加网址重定向中间件(UseRewriter) ...

  5. [译]ASP.NET Core 2.0 带初始参数的中间件

    问题 如何在ASP.NET Core 2.0向中间件传入初始参数? 答案 在一个空项目中,创建一个POCO(Plain Old CLR Object)来保存中间件所需的参数: public class ...

  6. Amazing ASP.NET Core 2.0

    前言 ASP.NET Core 的变化和发展速度是飞快的,当你发现你还没有掌握 ASP.NET Core 1.0 的时候, 2.0 已经快要发布了,目前 2.0 处于 Preview 1 版本,意味着 ...

  7. ASP.NET Core 2.0 : 三. 项目结构

    ASP.NET Core 2.0 : 三. 项目结构 原文:ASP.NET Core 2.0 : 三. 项目结构 本章我们一起来对比着ASP.NET Framework版本看一下ASP.NET Cor ...

  8. asp.net core 2.0 web api + Identity Server 4 + angular 5 可运行前后台源码

    前台使用angular 5, 后台是asp.net core 2.0 web api + identity server 4. 从头编写asp.net core 2.0 web api 基础框架: 第 ...

  9. 用ASP.NET Core 2.0 建立规范的 REST API -- GET 和 POST

    本文转自:https://www.cnblogs.com/cgzl/archive/2018/05/23/9047626.html 本文所需的一些预备知识可以看这里: http://www.cnblo ...

  10. .NET Core ASP.NET Core 1.0在Redhat峰会上正式发布

    众所周知,Red Hat和微软正在努力使.NET Core成为Red Hat企业版Linux (RHEL)系统上的一流开发平台选项.这个团队已经一起工作好几个月了,RHEL对.NET有许多需求.今天在 ...

最新文章

  1. mysql_secure_installation
  2. C Socket通信编程
  3. C语言程序设计 | 模拟实现字符串操作函数:strlen, strcmp, strcpy, strcat, strchr, strstr
  4. 机器学习sklearn的快速使用--周振洋
  5. Spring Boot 自定义属性值
  6. 自编fun函数求 N*N矩阵四周元素的平均值
  7. linux输入法_超强两笔输入法 入门简文
  8. docker实践第二版pdf 网盘_【漫画】什么是 docker?docker 应用场景解析
  9. 浮动元素经常和标准流父级搭配使用(HTML、CSS)
  10. python下载教程-如何下载python包
  11. Linux使用jstat命令查看jvm的GC情况(转)
  12. 软件测试2019:第八次作业—— 缺陷管理(含缺陷管理工具的配置实验)
  13. shell基本理论知识
  14. html基础:基本标签
  15. web前端培训:JQuery实现键盘打字游戏
  16. 开源ITIL框架 php,分享|如何在 CentOS 7 上安装开源 ITIL 门户 iTOP
  17. Pencil:开源的GUI原型设计工具
  18. 三剑合一称霸互联网时代——Serverless助推云计算-大数据-人工智能
  19. 使用VMware虚拟机搭建爱快路由器PPPoE服务器环境
  20. 970万,看美女是如何炼成巨贪的!

热门文章

  1. LR回归原理和损失函数的推导
  2. Deep learning-based CSI Feedback for Beamforming 2
  3. matlab之find函数
  4. python学习——和python的第一次亲密接触
  5. mysql 子查询 性能_mysql子查询性能
  6. MyEclipse问题收集
  7. 特征选择---文本分类:叉方统计量 卡方
  8. tail -f 命令卡住
  9. 2016-05-25 margin-right jsp获取页面流变量 文字颜色
  10. QT+ 状态栏+核心控件+浮动窗口