我正在构建一个控制台应用程序,为我做一些数据库工作,并希望设置不同的appsettings文件来存储每个环境的适当连接字符串。目前我的Main函数中就有这样的工作。
static void Main(string[] args)
{
IConfiguration config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", true, true)
.Build();
var dbconnection = config["db"];
}
但是当它工作时,只有一个全局的appsettings文件。我希望能够为每个环境创建不同的appsettings文件(例如 appsettings.Dev.json
, appsettings.Staging.json
等),但我不知道如何在运行应用程序时将配置管理器中的任何选择反馈到addjsonfile字符串中。
对于一些额外的上下文,我想在应用程序的稍后阶段将其馈送到我的dbcontext中,如果这有什么影响的话。
事实上,你正在构建一个控制台应用程序,这并不重要:你会用处理ASP.NET Core应用程序的方式来处理这个问题(实际上它也只是一个控制台应用程序)。
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
在这里。env
是一个实例 IHostingEnvironment
,这不适用于你的情况。然而,它的唯一目的是为了获得作为 environment
配置值。该值可以通过多种方式设置,最典型的是通过下面的 ASPNETCORE_ENVIRONMENT
环境变量。但是,它也可以作为命令行参数传递。由于你在这里构建的是一个控制台应用程序,你可以随意提供它。最后,你将简单地把环境值和子进入到 AddJsonFile
呼叫。
// get environment value from either `Environment.GetEnvironmentVariable` or by parsing command line arguments
.AddJsonFile($"appsettings.{myEnvironment}.json", optional: true, reloadOnChange: true);
你也可以选择分两轮进行配置。在第一轮中,你添加环境变量和或命令行参数配置提供者,构建该配置源,然后用它来调出第二个配置设置的环境值,也就是你要实际使用的那个。仅仅对于环境变量来说,这有点矫枉过正,但如果你想通过命令行参数提供值的选项,所有这些手动解析都会很痛苦。
这里的其他回答很有帮助,但我想为其他遇到这个问题的人展开我的具体做法。
你要做的第一件事是进入你的启动设置.json并添加这样的东西。
{
"profiles": {
"DataMigration (Local)": {
"commandName": "Project",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Local"
}
},
"DataMigration (Dev)": {
"commandName": "Project",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Dev"
}
}
}
}
这将给你一个环境变量的访问权限,取决于你用哪个配置文件启动你的项目(注意配置管理器在这里没有影响)。
然后你可以创建不同的appsetting.json文件。例如,我做了一个 appsettings.Local.json
和a appsettings.Dev.json
文件。
appsettings.Local.json
{
"db": "connectionstringhere"
}
和
appsettings.Dev.json
{
"db": "connectionstringhere"
}
现在,你可以像这样访问你运行应用程序的环境变量。
static void Main(string[] args)
{
var myEnv = System.Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
IConfiguration config = new ConfigurationBuilder()
.AddJsonFile($"appsettings.{myEnv}.json", false)
.Build();
var dbconnection = config["db"];
}
为了更进一步,我没有在这里做,而是让db的上下文变得灵活,就像这样。
public class ShoppingDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var myEnv = System.Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
if(myEnv != null)
{
IConfiguration config = new ConfigurationBuilder()
.AddJsonFile($"appsettings.{myEnv}.json", false)
.Build();
var sl = config[$"db"];
optionsBuilder.UseSqlServer(sl);
}
else
{
// we are testing and want local for sure
IConfiguration config = new ConfigurationBuilder()
.AddJsonFile($"appsettings.Local.json", false)
.Build();
var sl = config[$"db"];
optionsBuilder.UseSqlServer(sl);
}
}
public DbSet<MyTable> MyTables { get; set; }
}