C# .NETのアプリケーションで環境変数によってコードを切り替える

はじめに

.NETのアプリケーションで環境によってコードを切り替えたいケースがあった。
行った変更について記載しておく。

環境

Windows 11 Professional
Visual Studio 2022 Community
.NET8

今回行った修正

https://github.com/katsuobushiFPGA/AzureStorageSample/commit/438f4250ee5f869725c4210de63f3c3223bff701

方針

設定ファイルについて

C# .NETのコンソールアプリケーションで環境ごとに異なる設定ファイルを使いたい場合、通常はappsettings.{Environment}.jsonファイルを使い分けるのが良い。
この手順に従うことで、実行環境に応じて適切な設定ファイルを自動的に読み込むことができる。

例えば、本番環境であれば appsettings.Production.json といった感じになる。

環境変数について

ローカル環境では、launchSettings.jsonが利用できる。
別の環境では、環境変数を設定して実行することのが良い。

launchSettings.jsonProperties/launchSettings.jsonのパスに置くことに注意。

修正

設定ファイルの追加

appsettings.jsonの他に、appsettings.Development.jsonを追加した。
また、appsettings.jsonについていらない設定は削除した。

接続先は、Azuriteになっている。

appsettings.Development.json
{
  "ConnectionStrings": {
    "AzureStorageConnection": "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;TableEndpoint=http://127.0.0.1:10002/devstoreaccount1;"
  },
  "AzureStorage": {
    "ContainerName": "sample-container",
    "BlobSettings": {
      "PublicAccessLevel": "Blob"
    }
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  }
}

appsettings.jsonは以下の通り、ログの設定のみにした。

appsettings.json
{
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
        }
    }
}

launchSettings.jsonの追加

Propertiesディレクトリの中にlaunchSettings.jsonを作成した。

launchSettings.json
{
  "profiles": {
    "ConsoleApp": {
      "commandName": "Project",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

environmentVariablesASPNETCORE_ENVIRONMENT を設定し、 値は Developmentとする。

Program.csの修正

Program.cs
using AzureStorageSample.Context;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace AzureStorageSample
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // 環境変数の取得
            var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production";

            // 設定ファイルの読み込み
            var configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{environment}.json", optional: true)
                .Build();

            Console.WriteLine($"Current Environment: {environment}");

            // サービスプロバイダーの構築
            var serviceProvider = new ServiceCollection()
                .AddSingleton<IConfiguration>(configuration)
                .AddSingleton<AzureStorageContext>()
                .BuildServiceProvider();

            // サービスの取得
            var context = serviceProvider.GetService<AzureStorageContext>();
            var containerClient = context.GetBlobContainerClient("sample-container");

            // コンテナが存在しない場合は作成
            await containerClient.CreateIfNotExistsAsync();
            Console.WriteLine("コンテナ 'sample-container' を作成しました。");

            // Blob操作のサンプル
            string localFilePath = "sample.txt";
            await File.WriteAllTextAsync(localFilePath, "Hello, Azure Blob Storage!");
            string blobName = Path.GetFileName(localFilePath);

            // sample.txtをコンテナにアップロードする
            var blobClient = containerClient.GetBlobClient(blobName);
            await blobClient.UploadAsync(localFilePath, true);
            Console.WriteLine($"'{blobName}' をアップロードしました。");
        }
    }
}

これで環境ごとの設定ファイルを用意することで接続先を切り替えられるようになる。

参考

おわりに

今回は、環境ごとに切り替えるように実装をしてみた。
次回以降は、ASP.NET CoreのアプリケーションをAzureにデプロイするみたいなことをやってみたい。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。