EnvironmentNameをIWebHostEnvironment.EnvironmentNameを使わずに取得してみる

EnvironmentNameをProgram.cs内で参照したい

具体的には、Mainメソッド内で

CreateHostBuilder(args).Build().Run();

ってやってるところで、ロギングしたかったり、CreateHostBuilderのところで、そもそもEnvironmentNameに対応したappsettings.XXX.jsonで、ロギングの設定を切り替えたい欲があります。(ProdではFatalだけでいいですし、開発環境ならDebugログまで全部ほしかったりするので。)

書いてみた

using System;

namespace Microsoft.AspNetCore.Hosting {
    public static class DefaultEnvironmentNames {
        public const string Development = nameof(Development);

        public const string DevelopmentRemote = nameof(DevelopmentRemote);

        public const string Staging = nameof(Staging);

        public const string Production = nameof(Production);
    }

    public static class DefaultEnvironment {
        public static string GetEnvironmentName() {
            return Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? DefaultEnvironmentNames.Production;
        }
    }
}

DefaultEnvironment .GetEnvironmentName() という、環境変数"ASPNETCORE_ENVIRONMENT"を取得し、取得結果がnullであれば、"Production"を返却するだけのきわめてシンプルなメソッド(とそれを実現するためのクラス2つ)を書いてみました。 C#、というか.NETには、古の昔から環境変数を取り扱えるEnvironmentクラス(@System名前空間)が存在しているので、環境変数を取得するコード自体は随分昔から変わらないですね。 蓋を開けてみれば、.NET Framework時代に使っていた名前空間 / Object / Api の利用経験を思い出すことで解決可能でした。

C# / .NETは、バージョンが上がるたびに別物感を感じる瞬間があるんですが、やはり地続きなんだなあと感じました。(小並感)