appSettings.dev.json
和appSettings.test.json
。这对于ASP.NET Core web应用程序来说似乎非常直截了当,通过依赖注入、IHostingEnvironment和EnvironmentName环境变量进行,但是对于控制台应用程序,除了编写自己的自定义代码使用Microsoft.Framework.Configuration.EnvironmentVariables
之外,我该如何连接它们呢?谢谢。appSettings.dev.json
和appSettings.test.json
。这对于ASP.NET Core web应用程序来说似乎非常直截了当,通过依赖注入、IHostingEnvironment和EnvironmentName环境变量进行,但是对于控制台应用程序,除了编写自己的自定义代码使用Microsoft.Framework.Configuration.EnvironmentVariables
之外,我该如何连接它们呢?谢谢。这就是我们在.netcore
控制台应用程序中的做法。关键在于确保在项目中包含正确的依赖项 (可能不是全部,根据您的需要进行检查),并且将appSetting.json作为生成选项的一部分复制到输出目录。
{
"buildOptions": {
"emitEntryPoint": true,
"copyToOutput": {
"include": [
"appsettings*.json",
"App*.config"
]
}
},
using Microsoft.Extensions.Configuration;
namespace MyApp
{
public static void Main(string[] args)
{
var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var builder = new ConfigurationBuilder()
.AddJsonFile($"appsettings.json", true, true)
.AddJsonFile($"appsettings.{environmentName}.json", true, true)
.AddEnvironmentVariables();
var configuration = builder.Build();
var myConnString= configuration.GetConnectionString("SQLConn");
}
}
自Net Core 3.1++版本开始,泛型主机类Microsoft.Extensions.Hosting.Host使用DOTNET_ENVIRONMENT环境变量而非ASPNETCORE_ENVIRONMENT。
在项目调试设置中设置DOTNET_ENVIRONMENT="Development"
即可在无需额外编写代码的情况下运行。
或者您可以按照以下方式添加自己的前缀:
// works for WPF but should work similar for Console Apps
public partial class App : Application
{
private readonly IHost _host;
public App()
{
_host = Host.CreateDefaultBuilder()
.ConfigureHostConfiguration(configHost => {
configHost.AddEnvironmentVariables(prefix: "PREFIX_");
})
.ConfigureServices((context, services) =>
{
ConfigureServices(context.Configuration, services);
})
.Build();
}
private void ConfigureServices(
IConfiguration configuration,
IServiceCollection services)
{
// ...
}
// ...
}
如果您正在使用.NET Core版本2.1.0+和Microsoft.Extensions.Hosting来托管控制台应用程序,则可以使用以下代码(根据Feiyu Zhou在另一个线程中的答案):
var hostBuilder = new HostBuilder()
.ConfigureHostConfiguration(config =>
{
if (args != null)
{
// enviroment from command line
// e.g.: dotnet run --environment "Staging"
config.AddCommandLine(args);
}
})
.ConfigureAppConfiguration((context, builder) =>
{
builder.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", optional: false)
.AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", optional: true);
})
你应该使用两个IHostingEnvironment
接口,一个是用于ASP.NET Core应用程序的,另一个是用于.NET Core控制台应用程序的。你可以将此代码示例用于这两种应用程序:
using System;
using System.IO;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting.Internal;
namespace MyApplication.Common
{
public static class ConfigurationFactory
{
/// <summary>
/// Use for ASP.NET Core Web applications.
/// </summary>
/// <param name="config"></param>
/// <param name="env"></param>
/// <returns></returns>
public static IConfigurationBuilder Configure(IConfigurationBuilder config, IHostingEnvironment env)
{
return Configure(config, env.EnvironmentName);
}
/// <summary>
/// Use for .NET Core Console applications.
/// </summary>
/// <param name="config"></param>
/// <param name="env"></param>
/// <returns></returns>
private static IConfigurationBuilder Configure(IConfigurationBuilder config, Microsoft.Extensions.Hosting.IHostingEnvironment env)
{
return Configure(config, env.EnvironmentName);
}
private static IConfigurationBuilder Configure(IConfigurationBuilder config, string environmentName)
{
return config
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
}
/// <summary>
/// Use for .NET Core Console applications.
/// </summary>
/// <returns></returns>
public static IConfiguration CreateConfiguration()
{
var env = new HostingEnvironment
{
EnvironmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production",
ApplicationName = AppDomain.CurrentDomain.FriendlyName,
ContentRootPath = AppDomain.CurrentDomain.BaseDirectory,
ContentRootFileProvider = new PhysicalFileProvider(AppDomain.CurrentDomain.BaseDirectory)
};
var config = new ConfigurationBuilder();
var configured = Configure(config, env);
return configured.Build();
}
}
}
using Microsoft.AspNetCore.Hosting;
语句,并清楚地定义完整的新建议接口。在这种情况下,“用于ASP.NET Core Web应用程序。”:public static IConfigurationBuilder Configure(IConfigurationBuilder config, Microsoft.AspNetCore.Hosting.IWebHostEnvironment env)
和“用于.NET Core控制台应用程序。”:private static IConfigurationBuilder Configure(IConfigurationBuilder config, Microsoft.Extensions.Hosting.IHostEnvironment env)
。 - Arvo Bowen如果和我一样,你只是想为发布模式和开发模式使用不同的配置文件,只需在appsettings.Development.json文件的属性窗口中将CopyToOutputDirectory设置为true即可。
现在,根据生成配置访问该文件,可以使用#if DEBUG预处理指令。
以下是示例:
static void Main(string[] args)
{
#if DEBUG
var builder = new ConfigurationBuilder()
.AddJsonFile($"appsettings.Development.json", true, true);
#else
var builder = new ConfigurationBuilder()
.AddJsonFile($"appsettings.json", true, true);
#endif
var configuration = builder.Build();
// ... use configuration
}
appsettings.json
文件(解决@jcvandan从未加载它的问题),并且#if DEBUG
也加载appsettings.Development.json
- 标准方式是允许开发环境覆盖设置(如果需要),而不必指定所有设置。 - oatsoda#if DEBUG
是我使用的方式,但只是为了将环境变量设置为 Development
或默认情况下的 Production
。我发现对于控制台应用程序,Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")
总是返回 Production
,除非您使用 launchSettings.json 文件(或其他更深层次的调整),这些解决方案都没有提到。使用默认的 VS 模板和默认的控制台应用程序模板,这是唯一的解决方案,可以简单地拥有一个没有额外配置的开发环境。 - Sum None这些环境设置似乎适用于大多数人,但我完全不同意所有的环境管理。无论运行时还是目标系统都不知道它是什么。只有你作为开发者或部署机制知道目标系统是什么。
每个人都在谈论ASPNETCORE_ENVIRONMENT变量,甚至官方文档也是如此,例如这里。但实际上,必须有人明确地将一个系统定义为生产系统,例如通过手动设置ASPNETCORE_ENVIRONMENT一次。你真的想假定并依赖于它,认为这已经在你使用的每个环境中设置了吗?不,你不能。如果你需要将控制台应用程序部署到没有运行任何网站的批处理服务器上怎么办?ASPNETCORE_ENVIRONMENT不可用。如果你需要部署和运行一个没有IIS, 仅使用Kestrel的 .net core webapi 呢?没有web.config和环境变量。你希望你的管理员/操作团队为你的控制台应用程序设置这个误导性的变量吗?在这种情况下,我看到很多项目每个项目都有类似以下的appsettings:
appsettings.json
appsettings.development.json
appsettings.test.json
appsettings.uat.json
appsettings.staging.json
appsettings.production.json
如果你正在使用.NetCore 3.1并且使用.CreateDefaultBuilder(args)扩展,只需在调试设置中将-environment“Development”添加到命令行参数中即可。完成。
对于一个dotnet 2.x core控制台应用程序,类似于这样:
最初的回答:
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
[...]
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
var serviceProvider = new ServiceCollection()
.AddLogging(options => options.AddConfiguration(configuration).AddConsole())
.AddSingleton<IConfiguration>(configuration)
.AddSingleton<SomeService>()
.BuildServiceProvider();
[...]
await serviceProvider.GetService<SomeService>().Start();
SomeService
中注入ILoggerFactory和IConfiguration。"Original Answer"翻译成"最初的回答"。IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
// configure services here
})
.Build();
host.Run();
CreateDefaultBuilder()
方法,该方法预配置了所有这些源。您还可以使用流畅的API添加其他源,例如内存集合,这将优先于前面提到的源。using Microsoft.AspNetCore.Hosting;
using System;
public class Program {
private static string HostingEnvironment => Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
private static bool IsEnvironment(string environmentName) => HostingEnvironment?.ToLower() == environmentName?.ToLower() && null != environmentName;
private static bool Development => IsEnvironment(EnvironmentName.Development);
private static bool Production => IsEnvironment(EnvironmentName.Production);
private static bool Staging => IsEnvironment(EnvironmentName.Staging);
public static void Main(string[] args) { // Your code here }
}
然后你可以简单地使用该属性
public static void Main(string[] args) {
if (Development){
// Blow up the planet
}
}
new ConfigurationBuilder().AddEnvironmentVariables()
创建了配置构建器,并找到了ASPNETCORE_ENVIRONMENT
变量。 - user2916547Microsoft.Extensions.Configuration.Json
пјҡhttps://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.0&tabs=basicconfiguration#json-configuration - Junior Mayhé