새 .NET Core 콘솔 앱을 만들고 다음 패키지를 설치했습니다.
구성을 위해 appsettings.json 파일을 만들었습니다.
{
"app": {
"foo": "bar"
}
}
이 값을 클래스에 매핑하고 싶습니다.
internal class AppOptions
{
public string Foo { get; set; }
}
또한 구성 중에 옵션의 유효성을 검사하고 싶으므로 유효성 검사 클래스를 추가했습니다.
internal class AppOptionsValidator : IValidateOptions<AppOptions>
{
public ValidateOptionsResult Validate(string name, AppOptions options)
{
IList<string> validationFailures = new List<string>();
if (string.IsNullOrEmpty(options.Foo))
validationFailures.Add("Foo is required.");
return validationFailures.Any()
? ValidateOptionsResult.Fail(validationFailures)
: ValidateOptionsResult.Success;
}
}
DI 컨테이너를 설정하고 테스트 시나리오를 만들고 싶습니다.
static void Main(string[] args)
{
ConfigureServices();
Console.ReadLine();
}
private static void ConfigureServices()
{
IServiceCollection serviceCollection = new ServiceCollection();
IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
// Setup configuration service
IConfiguration configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", true, true)
.AddEnvironmentVariables()
.Build();
serviceCollection.AddSingleton(configuration);
// Setup options
IConfiguration configurationFromDI = serviceProvider.GetService<IConfiguration>(); // This is just for testing purposes
IConfigurationSection myConfigurationSection = configurationFromDI.GetSection("app");
serviceCollection.AddSingleton<IValidateOptions<AppOptions>, AppOptionsValidator>();
serviceCollection.Configure<AppOptions>(myConfigurationSection);
// Try to read the current options
IOptions<AppOptions> appOptions = serviceProvider.GetService<IOptions<AppOptions>>();
Console.WriteLine(appOptions.Value.Foo);
}
불행히도 변수 configurationFromDI
는 null입니다. 따라서 변수 configuration
는 DI 컨테이너에 추가되지 않았습니다.
콘솔 애플리케이션에 대한 종속성 주입을 올바르게 설정하려면 어떻게해야합니까?
모든 서비스가 등록 된 후에 전화를 BuildServiceProvider
걸어야합니다 .
하지만이 모든 코드를 작성할 필요는 없습니다. 이미 많은 확장을 사용하고 있으므로 ASP.NET Core 애플리케이션이 , 메서드를 사용하고 사용하는 것과 동일한 방식으로 일반 Host 를 사용 하는 것이 더 낫고 더 쉽습니다 .ConfigureServices
ConfigureAppConfiguration
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureHostConfiguration(configuration =>
{
configuration....;
});
.ConfigureServices((hostContext, services) =>
{
var myConfigurationSection = configuration.GetSection("app");
services.AddSingleton<IValidateOptions<AppOptions>, AppOptionsValidator>();
services.Configure<AppOptions>(myConfigurationSection);
});
}
구성은 HostBuilderContext.Configuration 속성을 통해 사용할 수 있습니다 .
CreateDefaultBuilder 는 현재 폴더를 설정하고 환경 변수 및 appsettings.json
파일 사용을 구성 하므로 명시 적으로 추가 할 필요가 없습니다.
Appsettings.json 복사 설정
웹 응용 프로그램 템플릿에서 appsettings.json
파일이 자동으로 추가됩니다 Build Action
에 대한 속성 집합 Content
와 Copy to Output
에 행동 Copy if Newer
.
콘솔 앱에는 이러한 파일이 없습니다. 새로운하면 appsettings.json
파일을 수동으로 추가, 그것은 Build Action
입니다 None
및 Copy
에 Never
. 응용 프로그램이 디버깅 될 때 현재 디렉토리는 bin\Debug
입니다. 기본 설정 appsettings.json
으로 복사되지 않습니다.bin/Debug
Build Action
로 변경해야합니다 Content
및 Copy
설정해야합니다 Copy if Newer
나 Copy Always
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다