[C#] ConfigureServices에서 개발 / 스테이징 / 생산 호스팅 환경을 얻는 방법

시작 방법에서 개발 / 스테이징 / 생산 호스팅 환경을 얻으려면 어떻게해야 ConfigureServices합니까?

public void ConfigureServices(IServiceCollection services)
{
    // Which environment are we running under?
}

ConfigureServices방법은 단일 IServiceCollection매개 변수 만 사용합니다 .



답변

ConfigureServices에서 쉽게 액세스 할 수 있으며, 먼저 호출되어 시작된 Startup 메소드 중에 특성에 유지 한 다음 ConfigureServices에서 특성에 액세스 할 수 있습니다.

public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
{
    ...your code here...
    CurrentEnvironment = env;
}

private IHostingEnvironment CurrentEnvironment{ get; set; }

public void ConfigureServices(IServiceCollection services)
{
    string envName = CurrentEnvironment.EnvironmentName;
    ... your code here...
}


답변

TL; DR

라는 환경 변수를 설정하십시오. ASPNETCORE_ENVIRONMENT 이름으로 (예 🙂 Production. 그런 다음 두 가지 중 하나를 수행하십시오.

  • IHostingEnvironment넣은 Startup.cs다음 ( env여기)를 사용 하여 확인하십시오.env.IsEnvironment("Production") . 하지 마십시오 사용 확인 env.EnvironmentName == "Production"!
  • 별도의 Startup수업 또는 개인을 사용하십시오Configure / ConfigureServices함수를 . 클래스 또는 함수가 이러한 형식과 일치하면 해당 환경의 표준 옵션 대신 사용됩니다.
    • Startup{EnvironmentName}() (전체 수업) || 예:StartupProduction()
    • Configure{EnvironmentName}()|| 예:ConfigureProduction()
    • Configure{EnvironmentName}Services()|| 예:ConfigureProductionServices()

전체 설명

.NET Core 문서 는이를 수행하는 방법을 설명합니다 . 라는 환경 변수를 사용하십시오.ASPNETCORE_ENVIRONMENT원하는 환경으로 설정된 두 가지 중에서 선택할 수 있습니다.

환경 이름 확인

문서에서 :

IHostingEnvironment서비스는 환경 작업을위한 핵심 추상화를 제공합니다. 이 서비스는 ASP.NET 호스팅 계층에서 제공되며 Dependency Injection을 통해 시작 논리에 주입 될 수 있습니다. Visual Studio의 ASP.NET Core 웹 사이트 템플릿은이 방법을 사용하여 환경 별 구성 파일 (있는 경우)을로드하고 앱의 오류 처리 설정을 사용자 지정합니다. 두 경우 모두,이 동작은 호출 EnvironmentName하거나 적절한 메소드로 전달 된 IsEnvironment인스턴스 에서 현재 지정된 환경을 참조하여 수행됩니다 IHostingEnvironment.

참고 : 실제 값 확인 env.EnvironmentName되어 있지 권장!

응용 프로그램이 특정 환경에서 실행 중인지 확인해야하는 env.IsEnvironment("environmentname")경우 ( env.EnvironmentName == "Development"예를 들어 확인하는 대신) 대소 문자를 올바르게 무시하므로 사용 하십시오 .

별도의 수업 사용

문서에서 :

ASP.NET Core 응용 프로그램이 시작되면이 Startup클래스는 응용 프로그램을 부트 스트랩하고 구성 설정을로드하는 데 사용됩니다 ( ASP.NET 시작에 대해 자세히 알아보기 ). 그러나 이름이 지정된 클래스 Startup{EnvironmentName}(예 :)가 StartupDevelopment있고 ASPNETCORE_ENVIRONMENT환경 변수가 해당 이름과 일치하면 해당 Startup클래스가 대신 사용됩니다. 따라서 Startup개발 용으로 구성 할 수 있지만 StartupProduction프로덕션에서 앱을 실행할 때 사용할 별도의 구성 요소가 있습니다. 혹은 그 반대로도.

Startup현재 환경에 따라 완전히 별개의 클래스 를 사용하는 것 외에도 클래스 내에서 응용 프로그램이 구성되는 방식을 조정할 수도 있습니다 Startup. Configure()ConfigureServices()방법은 유사 환경의 특정 버전 지원 Startup형태의 클래스 자체를, Configure{EnvironmentName}()하고 Configure{EnvironmentName}Services(). 메소드를 정의 하면 환경이 개발로 설정 될 때 ConfigureDevelopment()대신 메소드 가 호출됩니다 Configure(). 마찬가지로 같은 환경에서 ConfigureDevelopmentServices()대신 호출됩니다 ConfigureServices().


답변

에서 .NET Core 2.0MVC 응용 프로그램 /Microsoft.AspNetCore.All @vaindil에 의해 설명 된 바와 같이 V2.0.0, 당신은 환경 특정 시작 클래스를 가질 수 있지만, 그 방법 좋아하지 않는다.

또한 삽입 할 수 IHostingEnvironmentStartUp생성자입니다. 환경 변수를 Program클래스 에 저장할 필요는 없습니다 .

public class Startup
{
    private readonly IHostingEnvironment _currentEnvironment;
    public IConfiguration Configuration { get; private set; }

    public Startup(IConfiguration configuration, IHostingEnvironment env)
    {
        _currentEnvironment = env;
        Configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        ......

        services.AddMvc(config =>
        {
            // Requiring authenticated users on the site globally
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            config.Filters.Add(new AuthorizeFilter(policy));

            // Validate anti-forgery token globally
            config.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());

            // If it's Production, enable HTTPS
            if (_currentEnvironment.IsProduction())      // <------
            {
                config.Filters.Add(new RequireHttpsAttribute());
            }
        });

        ......
    }
}


답변

추가 속성이나 메서드 매개 변수없이 다음과 같이 수행 할 수 있습니다.

public void ConfigureServices(IServiceCollection services)
{
    IServiceProvider serviceProvider = services.BuildServiceProvider();
    IHostingEnvironment env = serviceProvider.GetService<IHostingEnvironment>();

    if (env.IsProduction()) DoSomethingDifferentHere();
}


답변

IHostingEnvironment에 쉽게 액세스 할 수없는 코드베이스의 어딘가에서 이것을 테스트 해야하는 경우 다른 쉬운 방법은 다음과 같습니다.

bool isDevelopment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development";


답변

문서

Configure 및 ConfigureServices는 Configure {EnvironmentName} 및 Configure {EnvironmentName} 서비스 형식의 환경 별 버전을 지원합니다.

이런 식으로 할 수 있습니다 …

public void ConfigureProductionServices(IServiceCollection services)
{
    ConfigureCommonServices(services);

    //Services only for production
    services.Configure();
}

public void ConfigureDevelopmentServices(IServiceCollection services)
{
    ConfigureCommonServices(services);

    //Services only for development
    services.Configure();
}

public void ConfigureStagingServices(IServiceCollection services)
{
    ConfigureCommonServices(services);

    //Services only for staging
    services.Configure();
}

private void ConfigureCommonServices(IServiceCollection services)
{
    //Services common to each environment
}


답변

내 서비스 중 하나에서 환경을 얻고 싶었습니다. 정말 쉽습니다! 나는 이것을 다음과 같이 생성자에 주입합니다.

    private readonly IHostingEnvironment _hostingEnvironment;

    public MyEmailService(IHostingEnvironment hostingEnvironment)
    {
        _hostingEnvironment = hostingEnvironment;
    }

이제 코드에서 나중에이 작업을 수행 할 수 있습니다.

if (_hostingEnvironment.IsProduction()) {
    // really send the email.
}
else {
    // send the email to the test queue.
}

편집하다:

위의 코드는 .NET Core 2 용 IWebHostEnvironment입니다. 버전 3의 경우을 사용하려고합니다 .