.NET Core 콘솔 앱에서 DI 컨테이너를 설정하는 방법은 무엇입니까?

올라프 스벤슨

새 .NET Core 콘솔 앱을 만들고 다음 패키지를 설치했습니다.

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.EnvironmentVariables
  • Microsoft.Extensions.Configuration.Json
  • Microsoft.Extensions.DependencyInjection
  • Microsoft.Extensions.Options
  • Microsoft.Extensions.Options.ConfigurationExtensions

구성을 위해 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 를 사용 하는 것이 더 낫고 더 쉽습니다 .ConfigureServicesConfigureAppConfiguration

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에 대한 속성 집합 ContentCopy to Output에 행동 Copy if Newer.

콘솔 앱에는 이러한 파일이 없습니다. 새로운하면 appsettings.json파일을 수동으로 추가, 그것은 Build Action입니다 NoneCopyNever. 응용 프로그램이 디버깅 될 때 현재 디렉토리는 bin\Debug입니다. 기본 설정 appsettings.json으로 복사되지 않습니다.bin/Debug

Build Action로 변경해야합니다 ContentCopy설정해야합니다 Copy if NewerCopy Always.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

공급자 (C # .NET Core 콘솔 앱)에서 Args를 가져 오는 방법은 무엇입니까?

분류에서Dev

.NET Core 콘솔 애플리케이션에서 MVVM을 구현하는 방법은 무엇입니까?

분류에서Dev

net.core 3.1에서 DI로 Identity Core를 올바르게 구성하는 방법은 무엇입니까?

분류에서Dev

.net Core 3.1 콘솔 앱에서 콘솔 로거를 작동시키는 방법

분류에서Dev

Ubuntu의 콘솔에서 slimerjs를 설정하는 방법은 무엇입니까?

분류에서Dev

.NET Core DI 컨테이너가 ILogger를 주입하지 않는 이유는 무엇입니까?

분류에서Dev

콘솔 앱에서 ConsoleLogger를 구성하는 방법은 무엇입니까?

분류에서Dev

MS.DI 및 .NET Core를 사용하여 정적 메서드에서 종속성 주입으로 리팩터링하는 방법은 무엇입니까?

분류에서Dev

모델에 DataAnnotations를 사용하는 속성으로 다른 클래스의 개체가 포함 된 경우 콘솔 앱의 .Net Core 3.1에서 모델을 검증하는 방법은 무엇입니까?

분류에서Dev

Blazor 앱에서 ASP.NET Core MVC 컨트롤러로 이동하는 방법은 무엇입니까?

분류에서Dev

콘솔없이 WebSphere에서 PARENT FIRST를 재설정하는 방법은 무엇입니까?

분류에서Dev

Qubes OS 4.0에서 sys-net에 대한 xl 콘솔 액세스를 얻는 방법은 무엇입니까?

분류에서Dev

Qubes OS 4.0에서 sys-net에 대한 xl 콘솔 액세스를 얻는 방법은 무엇입니까?

분류에서Dev

Dot Net Core 콘솔의 이미지를 실행할 때 시작시 Docker 컨테이너에 인수를 전달하는 방법

분류에서Dev

ViewDataDictionary에서 TemplateInfo를 설정하는 ASP.NET Core 방법은 무엇입니까?

분류에서Dev

VS Code에서 ASP.NET Core의 기본 포트를 설정하는 방법은 무엇입니까?

분류에서Dev

.NET Framework의 콘솔 앱에서 알림을 만드는 방법은 무엇입니까?

분류에서Dev

Git Bash에서 .net-core 콘솔 앱을 실행하는 동안 ReadKey에서 예외가 발생하는 이유는 무엇입니까?

분류에서Dev

.net core projet에 jquery를 설치하는 방법은 무엇입니까?

분류에서Dev

.NET Core DI-콘솔 앱에서 Singleton 서비스 폐기

분류에서Dev

CSS를 부모 컨테이너 내의 아이콘에 적용하는 방법은 무엇입니까?

분류에서Dev

콘솔 응용 프로그램에 대해 ASPNETCORE_ENVIRONMENT를 설정하는 방법은 무엇입니까?

분류에서Dev

AKS (Azure Kubernetes Service)에 포드로 배포 된 Asp.net Core Docker 컨테이너에서 Azure KeyVault에 액세스하는 방법은 무엇입니까?

분류에서Dev

.NET 일반 호스트를 사용하여 .NET Framework 4.8로 작성된 콘솔 앱에 REST API를 추가하는 방법은 무엇입니까?

분류에서Dev

Catalina의 콘솔에서 emacs를 시작하는 방법은 무엇입니까?

분류에서Dev

Tkinter에서 콘솔 로그를 "인쇄"하는 방법은 무엇입니까?

분류에서Dev

AWS 콘솔에서 AWSServiceRoleForSupport를 삭제하는 방법은 무엇입니까?

분류에서Dev

콘솔에서 xev를 시작하는 방법은 무엇입니까?

분류에서Dev

콘솔에서 xev를 시작하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    공급자 (C # .NET Core 콘솔 앱)에서 Args를 가져 오는 방법은 무엇입니까?

  2. 2

    .NET Core 콘솔 애플리케이션에서 MVVM을 구현하는 방법은 무엇입니까?

  3. 3

    net.core 3.1에서 DI로 Identity Core를 올바르게 구성하는 방법은 무엇입니까?

  4. 4

    .net Core 3.1 콘솔 앱에서 콘솔 로거를 작동시키는 방법

  5. 5

    Ubuntu의 콘솔에서 slimerjs를 설정하는 방법은 무엇입니까?

  6. 6

    .NET Core DI 컨테이너가 ILogger를 주입하지 않는 이유는 무엇입니까?

  7. 7

    콘솔 앱에서 ConsoleLogger를 구성하는 방법은 무엇입니까?

  8. 8

    MS.DI 및 .NET Core를 사용하여 정적 메서드에서 종속성 주입으로 리팩터링하는 방법은 무엇입니까?

  9. 9

    모델에 DataAnnotations를 사용하는 속성으로 다른 클래스의 개체가 포함 된 경우 콘솔 앱의 .Net Core 3.1에서 모델을 검증하는 방법은 무엇입니까?

  10. 10

    Blazor 앱에서 ASP.NET Core MVC 컨트롤러로 이동하는 방법은 무엇입니까?

  11. 11

    콘솔없이 WebSphere에서 PARENT FIRST를 재설정하는 방법은 무엇입니까?

  12. 12

    Qubes OS 4.0에서 sys-net에 대한 xl 콘솔 액세스를 얻는 방법은 무엇입니까?

  13. 13

    Qubes OS 4.0에서 sys-net에 대한 xl 콘솔 액세스를 얻는 방법은 무엇입니까?

  14. 14

    Dot Net Core 콘솔의 이미지를 실행할 때 시작시 Docker 컨테이너에 인수를 전달하는 방법

  15. 15

    ViewDataDictionary에서 TemplateInfo를 설정하는 ASP.NET Core 방법은 무엇입니까?

  16. 16

    VS Code에서 ASP.NET Core의 기본 포트를 설정하는 방법은 무엇입니까?

  17. 17

    .NET Framework의 콘솔 앱에서 알림을 만드는 방법은 무엇입니까?

  18. 18

    Git Bash에서 .net-core 콘솔 앱을 실행하는 동안 ReadKey에서 예외가 발생하는 이유는 무엇입니까?

  19. 19

    .net core projet에 jquery를 설치하는 방법은 무엇입니까?

  20. 20

    .NET Core DI-콘솔 앱에서 Singleton 서비스 폐기

  21. 21

    CSS를 부모 컨테이너 내의 아이콘에 적용하는 방법은 무엇입니까?

  22. 22

    콘솔 응용 프로그램에 대해 ASPNETCORE_ENVIRONMENT를 설정하는 방법은 무엇입니까?

  23. 23

    AKS (Azure Kubernetes Service)에 포드로 배포 된 Asp.net Core Docker 컨테이너에서 Azure KeyVault에 액세스하는 방법은 무엇입니까?

  24. 24

    .NET 일반 호스트를 사용하여 .NET Framework 4.8로 작성된 콘솔 앱에 REST API를 추가하는 방법은 무엇입니까?

  25. 25

    Catalina의 콘솔에서 emacs를 시작하는 방법은 무엇입니까?

  26. 26

    Tkinter에서 콘솔 로그를 "인쇄"하는 방법은 무엇입니까?

  27. 27

    AWS 콘솔에서 AWSServiceRoleForSupport를 삭제하는 방법은 무엇입니까?

  28. 28

    콘솔에서 xev를 시작하는 방법은 무엇입니까?

  29. 29

    콘솔에서 xev를 시작하는 방법은 무엇입니까?

뜨겁다태그

보관