はじめに
.NET
のアプリケーションで環境によってコードを切り替えたいケースがあった。
行った変更について記載しておく。
環境
Windows 11 Professional
Visual Studio 2022 Community
.NET8
今回行った修正
方針
設定ファイルについて
C# .NET
のコンソールアプリケーションで環境ごとに異なる設定ファイルを使いたい場合、通常はappsettings.{Environment}.json
ファイルを使い分けるのが良い。
この手順に従うことで、実行環境に応じて適切な設定ファイルを自動的に読み込むことができる。
例えば、本番環境であれば appsettings.Production.json
といった感じになる。
環境変数について
ローカル環境では、launchSettings.json
が利用できる。
別の環境では、環境変数を設定して実行することのが良い。
launchSettings.json
は Properties/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"
}
}
}
}
environmentVariables
に ASPNETCORE_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 で複数の環境を使用する
https://learn.microsoft.com/ja-jp/aspnet/core/fundamentals/environments?view=aspnetcore-8.0
おわりに
今回は、環境ごとに切り替えるように実装をしてみた。
次回以降は、ASP.NET Core
のアプリケーションをAzureにデプロイするみたいなことをやってみたい。