在dotNET Core
中默认情况下没有了之前版本的App.config
和Web.Config
文件,换成了新的json
格式的配置文件。当然,如果想使用之前的方式也是可以的。下面说说在dotNET Core
中各种使用配置的方法。
如果你还念旧,想使用之前的App.config
或Web.config
,可以导入System.Configuration.ConfigurationManager
包,使用方式和之前一样。
-w788
using System.Configuration;
...
static void Main(string[] args)
{
var connection = ConfigurationManager.ConnectionStrings["ConnectionStr"].ConnectionString;
var mqHostName = ConfigurationManager.AppSettings["MQHostName"];
Console.WriteLine($"connection:{connection}");
Console.WriteLine($"mqHostName:{mqHostName}");
Console.ReadLine();
}
1、创建一个控制台的应用程序NetCoreConfigDemo
;
2、导入依赖包,可以按需导入,也可以直接导入Microsoft.AspNetCore
的包,里面包含所有依赖的项;
-w1001
3、添加using Microsoft.Extensions.Configuration;
引用;
4、代码如下:
using System;
using Microsoft.Extensions.Configuration;
namespace NetCoreConfigDemo
{
class Program
{
static void Main(string[] args)
{
var builder = new ConfigurationBuilder()
.AddCommandLine(args);
var configration = builder.Build();
Console.WriteLine($"name:{configration["name"]}");
Console.ReadLine();
}
}
}
5、运行时指定name
参数,在命令行中可以正常打印出来
-w676
上面例子中的参数name
是在启动程序是指定的,如果想要程序有一个默认的参数值,可以在程序中初始化一个字典类Dictionary
,代码如下:
using System;
using Microsoft.Extensions.Configuration;
using System.Collections.Generic;
namespace NetCoreConfigDemo
{
class Program
{
static void Main(string[] args)
{
var dic = new Dictionary<string, string>() { { "name", "oec2003" } };
var builder = new ConfigurationBuilder()
.AddInMemoryCollection(dic)
.AddCommandLine(args);
var configration = builder.Build();
Console.WriteLine($"name:{configration["name"]}");
Console.ReadLine();
}
}
}
注意:
AddInMemoryCollection
必须放在AddCommandLine
的前面,否则默认值会覆盖掉在外部指定的参数值。
1、在控制台项目中添加json
文件App.json
,文件内容如下:
{
"name": "oec2003"
}
2、设置App.json
的属性
-w347
3、编写代码读取App.json
文件内容
using System;
using Microsoft.Extensions.Configuration;
namespace NetCoreConfigDemo
{
class Program
{
static void Main(string[] args)
{
var builder = new ConfigurationBuilder()
.AddJsonFile("App.json");
var configration = builder.Build();
Console.WriteLine($"name:{configration["name"]}");
Console.ReadLine();
}
}
}
1、创建AspNetCore MVC
项目NetCoreConfigWebDemo
;
2、在appsettings.json
文件中追加如下内容:
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
//下面为新添加的内容
"UserInfo": {
"UserName": "oec2003",
"Age": "18",
"Address": "wuhan china"
}
}
3、修改Startup
类中的Configure
方法;
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
......
//读取配置文件内容到UserInfo类
var userInfo = new UserInfo();
Configuration.GetSection("UserInfo").Bind(userInfo);
Console.WriteLine($"Name:{userInfo.UserName}");
Console.WriteLine($"Age:{userInfo.Age}");
Console.WriteLine($"Address:{userInfo.Address}");
}
4、运行程序可以看到配置文件内容可以正常打印在控制台中
-w647
修改NetCoreConfigWebDemo
项目Startup
的ConfigureServices
方法,添加对UserInfo
类的注册
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
//注册UserInfo类
services.Configure<UserInfo>(Configuration.GetSection("UserInfo"));
}
1、在HomeContrller
中添加对IOptions
的注入
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
namespace NetCoreConfigWebDemo.Controllers
{
public class HomeController : Controller
{
private UserInfo _userInfo;
public HomeController(IOptions<UserInfo> options)
{
_userInfo = options.Value;
}
public IActionResult Index()
{
return View(_userInfo);
}
}
}
2、Html模版的代码如下:
@model NetCoreConfigWebDemo.UserInfo;
@{
ViewData["Title"] = "Home Page";
}
<h2>UserInfo</h2>
<ul>
<li>UserName:@Model.UserName</li>
<li>Age:@Model.Age</li>
<li>Address:@Model.Address</li>
</ul>
HomeController
中不需要做任何事,直接在Html
模版中注入IOptions
@using Microsoft.Extensions.Options;
@inject IOptions<NetCoreConfigWebDemo.UserInfo> userInfo;
@{
ViewData["Title"] = "Home Page";
}
<h2>UserInfo</h2>
<ul>
<li>UserName:@userInfo.Value.UserName</li>
<li>Age:@userInfo.Value.Age</li>
<li>Address:@userInfo.Value.Address</li>
</ul>
运行效果如下图:
-w482
在原来的Asp.Net
中如果修改了Web.config
文件,网站会自动重新启动,自动重启会影响用户的访问,在dotNET Core
中可以使用热更新的方式,让用户无感知的进行配置文件的更新。
实现的方式非常简单,只需要将上面代码的IOptions
修改为IOptionsSnapshot
就可以了。
@using Microsoft.Extensions.Options;
@inject IOptionsSnapshot<NetCoreConfigWebDemo.UserInfo> userInfo;
@{
ViewData["Title"] = "Home Page";
}
<h2>UserInfo</h2>
<ul>
<li>UserName:@userInfo.Value.UserName</li>
<li>Age:@userInfo.Value.Age</li>
<li>Address:@userInfo.Value.Address</li>
</ul>
dotNET Core
虽然提供了很多种配置的Provider
,但一些特殊场景下不能完全满足需求,我们可以通过扩展来实现自己的Provider
,需要实现IConfigurationSource
和IConfigurationProvider
接口,下面以Redis
配置为例,来实现自定义的Provider
。
1、创建控制台项目NetCoreRedisConfigDemo
;
2、创建RedisConfigSource
类、RedisConfigProvider
类、RedisConfigExtension
类;
using System;
using Microsoft.Extensions.Configuration;
namespace NetCoreRedisConfigDemo
{
public class RedisConfigSource : IConfigurationSource
{
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return new RedisConfigProvider();
}
}
}
using Microsoft.Extensions.Configuration;
using System.Collections.Generic;
namespace NetCoreRedisConfigDemo
{
public class RedisConfigProvider:ConfigurationProvider
{
public RedisConfigProvider()
{
}
public override void Load()
{
Dictionary<string, string> dic = new Dictionary<string, string>()
{
{"HostName","localhost"},
{"Port","6379"},
{"Password","123456"}
};
Data = dic;
}
}
}
using System;
using Microsoft.Extensions.Configuration;
namespace NetCoreRedisConfigDemo
{
public static class RedisConfigExtension
{
public static IConfigurationBuilder AddRedisConfig(this IConfigurationBuilder builder)
{
return builder.Add(new RedisConfigSource());
}
}
}
3、在Main
方法中可以使用我们自定义的Provider
using System;
using Microsoft.Extensions.Configuration;
namespace NetCoreRedisConfigDemo
{
class Program
{
static void Main(string[] args)
{
var builder = new ConfigurationBuilder()
.AddRedisConfig();
var configration = builder.Build();
Console.WriteLine($"HostName:{configration["HostName"]}");
Console.WriteLine($"Port:{configration["Port"]}");
Console.WriteLine($"Password:{configration["Password"]}");
Console.ReadLine();
}
}
}
运行结果如下:
-w579
在Web
项目中,我们可以使用环境变量来区分开发环境、测试环境和生产环境,默认情况下会有一个开发环境的环境变量的配置
-w753
在Web
项目的Statup
类的Configure方法中有对环境变量的判断,可以根据不同的环境来处理不同的业务逻辑。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
......
}
另外一种情况,当我们的程序运行在Docker
中,在容器启动时需要传入一些参数到程序内部,这是就需要使用环境变量,下面一个简单例子演示一下:
1、创建控制台程序NetCoreEnvironmentDemo
;
2、Program
类的代码如下:
using System;
namespace NetCoreEnvironmentDemo
{
class Program
{
static void Main(string[] args)
{
string name = Environment.GetEnvironmentVariable("name");
string age = Environment.GetEnvironmentVariable("age");
Console.WriteLine($"name:{name}");
Console.WriteLine($"age:{age}");
Console.ReadLine();
}
}
}
3、创建Dockerfile
文件,内容如下:
FROM microsoft/aspnetcore
COPY . /app
WORKDIR /app
EXPOSE 80/tcp
ENTRYPOINT ["dotnet", "NetCoreEnvironmentDemo.dll"]
4、使用命令dotnet publish
发布程序;
5、进入到publish目录,使用docker build -t envtest .
命令将程序打包成镜像;
6、使用命令docker run -d -p 81:80 -e "name=oec2003" -e "age=18" --name envtest envtest:latest
创建容器;
7、使用docker logs 容器id
查看容器日志
-w905
在dotNET Core
中,配置的方式有多种,而且可以根据需要自行扩展,可以说能够满足各种类型的需求了。点击「查看原文」可以查看本文的示例代码。