c# - 在 .NET Core 控制台应用程序中使用 appsettings.ENV.json
问题描述
我正在构建一个控制台应用程序来为我做一些数据库工作,并希望设置不同的 appsettings 文件来为每个环境存储适当的连接字符串。目前,我的 Main 函数中有这样的工作:
static void Main(string[] args)
{
IConfiguration config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", true, true)
.Build();
var dbconnection = config["db"];
}
但是,虽然这有效,但它只是一个全局 appsettings 文件。我希望能够为每个环境(例如appsettings.Dev.json
,appsettings.Staging.json
等)创建不同的应用程序设置,但是当我将应用程序运行到 addjsonfile 字符串时,我无法弄清楚如何将配置管理器中的任何选择提供给我。
对于一些额外的上下文,如果这会影响任何内容,我想稍后在应用程序中将其输入到我的 dbcontext 中。
解决方案
这里的其他答案很有帮助,但我想详细说明我为遇到此问题的其他人所做的事情。
您要做的第一件事是进入您的启动 settings.json 并添加如下内容:
{
"profiles": {
"DataMigration (Local)": {
"commandName": "Project",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Local"
}
},
"DataMigration (Dev)": {
"commandName": "Project",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Dev"
}
}
}
}
这将使您可以访问环境变量,具体取决于您使用哪个配置文件启动项目(请注意配置管理器在这里没有影响)。
然后你可以创建不同的 appsetting.json 文件。例如,我制作了一个appsettings.Local.json
和一个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 context 灵活设置,如下所示:
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; }
}
推荐阅读
- visual-studio-code - 在集成 Powershell 窗口中使用默认 Powershell
- c - fprintf 打开文件,但没有写在上面
- python - 复数的numpy小数点精度
- python - 如果在执行 iterrows 时匹配给定条件,则删除行
- vba - 在当前查看的页面上选择表格(不是当前选择的页面)
- ubuntu-16.04 - EAP-FAST 的 hostapd 基本配置?
- python - 有问题的 for 循环:重复打印包含目录中文件中的关键短语的行
- google-analytics - GTM 在会话期间保持相同的变量值
- javascript - 通过 reducer 获取相同的数据或空数据
- unity3d - 生成和显示数千个多边形的最佳实践