2022. 9. 7. 00:00ㆍDOTNET/Generic Host
Console app 에서 json 파일을 이용하여 Configuration 을 구성하자
일반적으로 aspnet core 같은 경우 appsetting.json , appsetting.{environment}.json 형태로 이루어져있다.
그리고 이곳에 개발에 필요한 값들을 정리해서 사용한다.
일단 필요한 package 부터 설치해보자
dotnet add package Microsoft.Extensions.Configuration.Binder
dotnet add package Microsoft.Extensions.Configuration.Json
dotnet add package Microsoft.Extensions.Configuration.EnvironmentVariables
Microsoft.Extensions.Configuration.Binder
: 데이터에 개체를 바인딩하는 기능
Microsoft.Extensions.Configuration.Json
: JSON 구성 공급자 구현
Microsoft.Extensions.Configuration.EnvironmentVariables
: 환경 변수 구성 공급자 구현
Program.cs 로 이동하여 다음 라인을 확인해보자.
CreateDefaultBuilder 는 configuration 관련 하여 다음 작업을 기본으로 설정한다.
- appsettings.json.
- appsettings.{Environment}.json.
- Secret Manager: 앱이 Development 환경에서 실행되는 경우
- 환경 변수.
- 명령줄 인수. (Command-line arguments)
이제 Project 에 appsettings.json 파일을 추가해 보자.
해당 파일에서 마우스 우클릭 후 속성을 다음과 같이 변경하자
appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"User":{
"Name":"Yogingang",
"Age":18
}
}
이제 worker.cs 에서 appsettings.json 의 값을 가져와 보자
Worker.cs
....
public Worker(
ILogger<Worker> logger,
IHostApplicationLifetime appLifetime,
IHelloworld helloworld,
IConfiguration configuration)
{
_logger = logger;
_helloworld = helloworld;
_configuration = configuration;
appLifetime.ApplicationStarted.Register(OnStarted);
appLifetime.ApplicationStopping.Register(OnStopping);
appLifetime.ApplicationStopped.Register(OnStopped);
}
...
IConfiguration 을 Constructor 에서 Injection 한 후 사용해 보자
private void OnStarted()
{
...
var name = _configuration.GetSection("User").GetValue<string>("Name");
var age = _configuration.GetSection("User").GetValue<int>("Age");
_logger.LogInformation($"2.2. Name = {name} , Age = {age} ");
...
}
private void OnStopped()
{
_logger.LogInformation("5. OnStopped has been called.");
var name = _configuration.GetSection("User").GetValue<string>("Name");
var age = _configuration.GetSection("User").GetValue<int>("Age");
_logger.LogInformation($"5.1. Name = {name} , Age = {age} ");
}
실행시 다음과 같은 내용이 표시된다.
그리고 ctrl + c 를 누르기 전에 \bin\Debug\net6.0\appsettings.json 파일을 임의로 열어서 Age 를 19 로 변경한 후 ctrl + c 를 누르자
변경이 적용되는 것을 알 수 있다.
그런데 이것을 적용하기 싫을 수 있다.
service 를 재 실행해야 appsettings.json 을 다시 읽어오게 하고 싶을수도 있다.
configuration 을 재 설정 해보자.
Program.cs 로 이동하여 다음을 설정하자
...
.ConfigureAppConfiguration((hostingContext, configuration) =>
{
configuration.Sources.Clear();
IHostEnvironment env = hostingContext.HostingEnvironment;
configuration
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: false)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, false);
})
.Build();
...
reloadOnChange 를 false 로 설정하면 변경사항이 바로 적용되지 않는다.
이와 같이 configuration 을 재 설정하는 것도 가능하다.
Generic Host 를 사용하게 되면 aspnet core 에서 사용했던 많은 부분을 재 사용할 수 있게 된다.
관련영상
'DOTNET > Generic Host' 카테고리의 다른 글
DotNET Console Generic Host - Event Driven With MediatR (0) | 2022.09.09 |
---|---|
DotNET Console Generic Host - Logging With Serilog (0) | 2022.09.08 |
DotNET Console Generic Host - Dependency Injection with Scrutor (0) | 2022.09.06 |
DotNET Console Generic Host - Create Project (0) | 2022.09.05 |