.NET Core 콘솔 응용 프로그램을위한 ASP.NET Core 구성


답변:


76

이 코드 스 니펫을 사용할 수 있습니다. 구성 및 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"
    ]
  },
...
}

12
이 답변은 이상적이지 않습니다. Directory.GetCurrentDirectory()대신 사용하십시오 AppContext.BaseDirectory. 나중에 해킹이 필요하지 않습니다.
Matyas

1
또는 JSON 파일에 대해 Visual Studio에서 "출력 디렉토리로 복사"특성을 "최신 경우 복사"로 설정하십시오.
BuddhiP

웹, 콘솔 및 Winforms에서 기본 디렉토리가 작동하려면이 접근법을 사용할 수 있습니다. stackoverflow.com/a/33675039/1818723
Pawel Cioch

게리 Woodfine이 게시물에 아주 좋은 스타일로 자세하게 설명 : garywoodfine.com/configuration-api-net-core-console-application
자바드 노로 우지에게

@javad 부분적으로 만; 나는 그가 약속 한 DI 부분을 원했기 때문에 여기에 왔지만 찾지 못했습니다. 또한이 예제와 같이 여러 구성 파일을 사용하는 방법을 보여주지 않았습니다.
Auspex

232

.NET Core 2.0 콘솔 앱의 경우 다음을 수행했습니다.

  1. appsettings.json 이라는 새 파일을 만듭니다.프로젝트 루트에 (파일 이름은 무엇이든 가능).
  2. 내 특정 설정을 json으로 해당 파일에 추가하십시오. 예를 들면 다음과 같습니다.
{
  "myKey1" :  "my test value 1", 
  "myKey2" :  "my test value 2", 
  "foo" :  "bar" 
}
  1. 프로젝트가 빌드 될 때마다 파일을 출력 디렉토리에 복사하도록 구성하십시오 (VS-> 솔루션 탐색기-> 파일을 마우스 오른쪽 버튼으로 클릭-> '속성'-> 고급-> 출력 디렉토리에 복사-> '항상 복사'를 선택하십시오)

  2. 내 프로젝트에 다음 nuget 패키지를 설치하십시오.

    • Microsoft.Extensions.Configuration.Json
  3. 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...
    }
  4. 그런 다음 다음 방법 중 하나를 사용하여 값을 읽으십시오.

    string myKey1 = configuration["myKey1"];
    Console.WriteLine(myKey1);
    
    string foo = configuration.GetSection("foo").Value;
    Console.WriteLine(foo);

자세한 정보 : https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration?tabs=basicconfiguration#simple-configuration


1
Microsoft가 예제에서 IConfigurationRoot를 사용하지 않고 IConfiguration을 사용한다는 것을 알았습니다.
aligin December

3
IConfigurationRoot.NET Core 2.0에서도 계속 사용할 수 있습니다 . 그것은 상속 IConfiguration하지만 일반적으로 사용되지 않는 파생 사례로 간주 됩니다 . 어쨌든 코드 예제는 포함되지 않고 혼동을 피하도록 업데이트되었습니다.
Ray

10
참고 2 개 : 포인트 4에는 Microsoft.Extensions.Configuration.Json 만 필요합니다. 기본적으로 다른 2 개가 포함됩니다. 둘째 : 섹션을 객체에로드하려면 다음을 아는 것이 좋습니다. var options = new FooOptions (); ConfigurationBinder.Bind (configuration.GetSection ( "foo"), 옵션); 당신은 Microsoft.Extensions.Options.ConfigurationExtensions가 필요합니다
Yepeekai

1
공개 클래스 FooOptions {공개 문자열 myKey1 {get; set;} 공개 문자열 myKey2 {get; set;}}
Yepeekai

2
도구> NuGet 패키지 관리자> 패키지 관리자 콘솔 .. .. 설치 패키지 Microsoft.Extensions.Configuration .. 설치 패키지 Microsoft.Extensions.Configuration.FileExtensions .. 설치 패키지 Microsoft.Extensions.Configuration.Json
Manohar Reddy Poreddy

19

Microsoft.Extensions.Hosting(버전 2.1.0 이상)을 사용 하여 콘솔 앱 및 asp.net 핵심 앱을 호스팅하는 경우 모든 구성에 HostBuilderConfigureAppConfigurationConfigureHostConfiguration메소드 가 주입됩니다 . 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" />

환경은 어떻게 결정됩니까? launchSettings에서 프로파일을 작성하면 실제로 설정 ASPNETCORE_ENVIRONMENT되지만 context.HostingEnvironment.EnvironmentName올바르게 설정되지 않습니다.
Sinaesthetic

환경을 키로 사용해야합니다. github.com/aspnet/Hosting/blob/dev/src/…
Feiyu Zhou

@FeiyuZhou 그것은 죽은 링크입니다
Auspex

아니다 모든 후,이 솔루션의 new HostBuilder()중복은? 하지 않습니다 HostBuilder모든 내부적으로합니까?
Auspex

@Auspex 콘솔 앱을 정의하는 방법에 따라 다릅니다. 사용자 정의 구성을 정의해야하는 경우 다음과 같이 설정해야합니다. 다음은 닷넷 코어 3.0에 대한 문서입니다. docs.microsoft.com/en-us/aspnet/core/fundamentals/host/…
Feiyu Zhou

10

나는 착각했다. ConfigurationBuildernetcore 콘솔 응용 프로그램에서 새로운 기능 을 사용할 수 있습니다 .

예는 https://docs.asp.net/en/latest/fundamentals/configuration.html 을 참조 하십시오 .

그러나 aspnet core에만 기본적으로 의존성 주입이 있으므로 강력한 유형의 구성 설정을 사용하지 않고을 사용하여 자동으로 주입 할 수 없습니다 IOptions.


9
이 답변은 유효하지만 필요한 코드를 포함해야하므로 공감할 수 없습니다.
Matyas

4
필요한 것은 패키지를 추가 Microsoft.Extensions.Options하고 전화하는 것입니다service.AddOptions();
Bruno Garcia

2
전체 (매우 긴) 링크 된 페이지는 모든 예제에서 "WebHost"를 언급하면서 ASP.NET과 관련된 것으로 보입니다. 링크 된 페이지를 찾고 "확인, ASP.NET, 콘솔 응용 프로그램은 어떻습니까?"라고 생각한 후에이 SO 질문에 도달했습니다.
mackenir 2014 년

@mackenir는 조금 이상합니다. 3.0에서는 모두 리팩토링되어 모두 호스트 일뿐입니다! WebHost 자체에 대한 유일한 참조는 2.2 설명서를 가리 킵니다. ConfigureWebHostDefaults()예제 의 호출은 선택 사항이며 웹 응용 프로그램에만 해당된다는 것이 조금 더 명확했을 수 있습니다 .
Auspex

4

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있습니다.


2

.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"
        }
      }
    ]
  }

웹에서 모든 구문을 시도한 후에는 귀하에게 맞는 구문이 매우 간단합니다.
GaneshT

도움이되어서 다행입니다.
어니스트

1

이를 위해 LiteWare.Configuration 라이브러리를 사용할 수 있습니다 . .NET Framework 원본 ConfigurationManager과 매우 유사 하며 .NET Core / Standard에서 작동합니다. 코드 측면에서는 다음과 같은 결과가 나타납니다.

string cacheDirectory = ConfigurationManager.AppSettings.GetValue<string>("CacheDirectory");
ulong cacheFileSize = ConfigurationManager.AppSettings.GetValue<ulong>("CacheFileSize");

면책 조항 : 저는 LiteWare.Configuration의 저자입니다.


0

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>();
  }

0

다음 패키지를 설치하십시오.

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.Binder
  • Microsoft.Extensions.Configuration.EnvironmentVariables
  • Microsoft.Extensions.Configuration.FileExtensions
  • Microsoft.Extensions.Configuration.Json

암호:

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; }
}

appsettings는 다음과 같이 간단 할 수 있습니다. 여기에 이미지 설명을 입력하십시오

또한 appsettings 파일을 최신 버전 인 경우 Content / Copy로 설정하십시오. 함유량

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.