ASP.NET Core는 다음과 같이 새로운 구성 시스템을 지원합니다. https://docs.asp.net/en/latest/fundamentals/configuration.html
이 모델은 .NET Core 콘솔 응용 프로그램에서도 지원됩니까?
그렇지 않다면 이전 app.config
과 ConfigurationManager
모델의 대안이 무엇 입니까?
ASP.NET Core는 다음과 같이 새로운 구성 시스템을 지원합니다. https://docs.asp.net/en/latest/fundamentals/configuration.html
이 모델은 .NET Core 콘솔 응용 프로그램에서도 지원됩니까?
그렇지 않다면 이전 app.config
과 ConfigurationManager
모델의 대안이 무엇 입니까?
답변:
이 코드 스 니펫을 사용할 수 있습니다. 구성 및 DI가 포함됩니다.
public class Program
{
public static ILoggerFactory LoggerFactory;
public static IConfigurationRoot Configuration;
public static void Main(string[] args)
{
Console.OutputEncoding = Encoding.UTF8;
string environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
if (String.IsNullOrWhiteSpace(environment))
throw new ArgumentNullException("Environment not found in ASPNETCORE_ENVIRONMENT");
Console.WriteLine("Environment: {0}", environment);
var services = new ServiceCollection();
// Set up configuration sources.
var builder = new ConfigurationBuilder()
.SetBasePath(Path.Combine(AppContext.BaseDirectory))
.AddJsonFile("appsettings.json", optional: true);
if (environment == "Development")
{
builder
.AddJsonFile(
Path.Combine(AppContext.BaseDirectory, string.Format("..{0}..{0}..{0}", Path.DirectorySeparatorChar), $"appsettings.{environment}.json"),
optional: true
);
}
else
{
builder
.AddJsonFile($"appsettings.{environment}.json", optional: false);
}
Configuration = builder.Build();
LoggerFactory = new LoggerFactory()
.AddConsole(Configuration.GetSection("Logging"))
.AddDebug();
services
.AddEntityFrameworkNpgsql()
.AddDbContext<FmDataContext>(o => o.UseNpgsql(connectionString), ServiceLifetime.Transient);
services.AddTransient<IPackageFileService, PackageFileServiceImpl>();
var serviceProvider = services.BuildServiceProvider();
var packageFileService = serviceProvider.GetRequiredService<IPackageFileService>();
............
}
}
아, 그리고 프로젝트에 추가하는 것을 잊지 마십시오.
{
"version": "1.0.0-*",
"buildOptions": {
"emitEntryPoint": true,
"copyToOutput": {
"includeFiles": [
"appsettings.json",
"appsettings.Integration.json",
"appsettings.Production.json",
"appsettings.Staging.json"
]
}
},
"publishOptions": {
"copyToOutput": [
"appsettings.json",
"appsettings.Integration.json",
"appsettings.Production.json",
"appsettings.Staging.json"
]
},
...
}
.NET Core 2.0 콘솔 앱의 경우 다음을 수행했습니다.
{ "myKey1" : "my test value 1", "myKey2" : "my test value 2", "foo" : "bar" }
프로젝트가 빌드 될 때마다 파일을 출력 디렉토리에 복사하도록 구성하십시오 (VS-> 솔루션 탐색기-> 파일을 마우스 오른쪽 버튼으로 클릭-> '속성'-> 고급-> 출력 디렉토리에 복사-> '항상 복사'를 선택하십시오)
내 프로젝트에 다음 nuget 패키지를 설치하십시오.
Program.cs (또는 어디에 있든지 Main()
)에 다음을 추가하십시오 .
static void Main(string[] args)
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json");
var configuration = builder.Build();
// rest of code...
}
그런 다음 다음 방법 중 하나를 사용하여 값을 읽으십시오.
string myKey1 = configuration["myKey1"];
Console.WriteLine(myKey1);
string foo = configuration.GetSection("foo").Value;
Console.WriteLine(foo);
IConfigurationRoot
.NET Core 2.0에서도 계속 사용할 수 있습니다 . 그것은 상속 IConfiguration
하지만 일반적으로 사용되지 않는 파생 사례로 간주 됩니다 . 어쨌든 코드 예제는 포함되지 않고 혼동을 피하도록 업데이트되었습니다.
Microsoft.Extensions.Hosting
(버전 2.1.0 이상)을 사용 하여 콘솔 앱 및 asp.net 핵심 앱을 호스팅하는 경우 모든 구성에 HostBuilder
의 ConfigureAppConfiguration
및 ConfigureHostConfiguration
메소드 가 주입됩니다 . appsettings.json
및 환경 변수 를 추가하는 방법에 대한 데모는 다음과 같습니다 .
var hostBuilder = new HostBuilder()
.ConfigureHostConfiguration(config =>
{
config.AddEnvironmentVariables();
if (args != null)
{
// enviroment from command line
// e.g.: dotnet run --environment "Staging"
config.AddCommandLine(args);
}
})
.ConfigureAppConfiguration((context, builder) =>
{
var env = context.HostingEnvironment;
builder.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", optional: false)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
// Override config by env, using like Logging:Level or Logging__Level
.AddEnvironmentVariables();
})
... // add others, logging, services
//;
위의 코드를 컴파일하려면 다음 패키지를 추가해야합니다.
<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.1.0" />
ASPNETCORE_ENVIRONMENT
되지만 context.HostingEnvironment.EnvironmentName
올바르게 설정되지 않습니다.
new HostBuilder()
중복은? 하지 않습니다 HostBuilder
모든 내부적으로합니까?
나는 착각했다. ConfigurationBuilder
netcore 콘솔 응용 프로그램에서 새로운 기능 을 사용할 수 있습니다 .
예는 https://docs.asp.net/en/latest/fundamentals/configuration.html 을 참조 하십시오 .
그러나 aspnet core에만 기본적으로 의존성 주입이 있으므로 강력한 유형의 구성 설정을 사용하지 않고을 사용하여 자동으로 주입 할 수 없습니다 IOptions
.
Microsoft.Extensions.Options
하고 전화하는 것입니다service.AddOptions();
ConfigureWebHostDefaults()
예제 의 호출은 선택 사항이며 웹 응용 프로그램에만 해당된다는 것이 조금 더 명확했을 수 있습니다 .
dotnet 2.x 코어 콘솔 응용 프로그램의 경우 다음과 같습니다.
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();
에 ILoggerFactory, IConfiguration을 주입 할 수 SomeService
있습니다.
.Net Core 3.1에서는 다음을 수행하면됩니다.
static void Main(string[] args)
{
var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
}
SeriLog를 사용하면 다음과 같습니다.
using Microsoft.Extensions.Configuration;
using Serilog;
using System;
namespace yournamespace
{
class Program
{
static void Main(string[] args)
{
var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(configuration).CreateLogger();
try
{
Log.Information("Starting Program.");
}
catch (Exception ex)
{
Log.Fatal(ex, "Program terminated unexpectedly.");
return;
}
finally
{
Log.CloseAndFlush();
}
}
}
}
매일 하나의 파일을 생성하는 Serilog appsetings.json 섹션은 다음과 같습니다.
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "C:\\Logs\\Program.json",
"rollingInterval": "Day",
"formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact"
}
}
]
}
이를 위해 LiteWare.Configuration 라이브러리를 사용할 수 있습니다 . .NET Framework 원본 ConfigurationManager
과 매우 유사 하며 .NET Core / Standard에서 작동합니다. 코드 측면에서는 다음과 같은 결과가 나타납니다.
string cacheDirectory = ConfigurationManager.AppSettings.GetValue<string>("CacheDirectory");
ulong cacheFileSize = ConfigurationManager.AppSettings.GetValue<ulong>("CacheFileSize");
면책 조항 : 저는 LiteWare.Configuration의 저자입니다.
Feiyu Zhou의 게시물과 비슷합니다 ... 여기에 머신 이름을 추가하고 있습니다.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, builder) =>
{
var env = context.HostingEnvironment;
var hostname = Environment.MachineName;
builder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{hostname}.json", optional: true, reloadOnChange: true);
builder.AddEnvironmentVariables();
if (args != null)
{
builder.AddCommandLine(args);
}
})
.UseStartup<Startup>();
}
다음 패키지를 설치하십시오.
암호:
static void Main(string[] args)
{
var environmentName = Environment.GetEnvironmentVariable("ENVIRONMENT");
Console.WriteLine("ENVIRONMENT: " + environmentName);
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", false)
.AddJsonFile($"appsettings.{environmentName}.json", true)
.AddEnvironmentVariables();
IConfigurationRoot configuration = builder.Build();
var mySettingsConfig = configuration.Get<MySettingsConfig>();
Console.WriteLine("URL: " + mySettingsConfig.Url);
Console.WriteLine("NAME: " + mySettingsConfig.Name);
Console.ReadKey();
}
MySettingsConfig 클래스 :
public class MySettingsConfig
{
public string Url { get; set; }
public string Name { get; set; }
}
Directory.GetCurrentDirectory()
대신 사용하십시오AppContext.BaseDirectory
. 나중에 해킹이 필요하지 않습니다.