.NETアプリケーションにデフォルト設定を適用する方法
読む所要時間: 10 分
過去に投稿したチュートリアル記事「TwilioとC#および.NETのアプリケーションをより良く構成する方法(英語)」と「SendGridとC#および.NETのアプリケーションをより良く構成する方法(英語)」では、Microsoft.Extensions.Configuration
APIを使用してアプリケーションの改善方法をご紹介しました。本稿では、これらのチュートリアルのテクニックを基に、デフォルトのオプションを設定の特定の場所に保存し、別の場所から上書きする方法をご紹介します。 例を挙げて説明します。アプリケーションから送るメールの種類は様々で、ウェルカムメール、パスワードリセットメール、オファーメールなどがあります。メールの種類によって、メールアドレスを使い分けたほうがよい場合もあります。「no-reply@yourdomain.tld」のように、返信不要のアドレスを使うことが多いですが、オファーメールでは受信者からの返信を受け取ることに大きな価値があることもあります。そこで、返信不要のアドレスを使う代わりに、返信を営業担当者に転送し、顧客関係管理(CRM)システムと自動的に統合されるようなメールアドレスを使うことができます。
本稿では、デフォルトの返信用アドレスとして「no-reply@yourdomain.tld」を使用しますが、オファーメールでは、例えば「offers@yourdomain.tld」のように別のメールアドレスを使用します。
必要事項
本稿を最後まで進めるには、以下の項目が必要です。
- C#および.NETを使用した経験
- .NETをサポートするOS(Windows・macOS・Linux)
- Git CLI
- .NET 6 SDK (これより古い・新しいバージョンでも問題ありません)
- コードエディタまたはIDE(VS CodeにC#プラグインをインストールする、Visual Studio、またはJetBrains Riderをお勧めします)
このチュートリアルのソースコードは、GitHubでご確認いただけます。何か問題が発生した場合は参考にしてください。また、サポートが必要な場合は イシューを送信してください。
はじめに
以下でご紹介する内容は、様々な場面に適用できますが、引き続きEメールの例を使用して進めていきます。
以下のコマンドを実行して、gitを使用してプロジェクトをあなたのマシンにクローンし、プロジェクトディレクトリに移動します。
クローンしたgitリポジトリには、すでにいくつかのJSONと設定を読み込むコードを格納した.NET 6コンソールアプリケーションが含まれています。
appsettings.jsonファイルは以下のような内容です。
Program.csファイルは、以下のような内容です。
このコードでは、JSONのみをソースとして使用して設定を構築します。そして、 GetEmailOptions
ローカル関数を使用して設定を取得し、ウェルカムメール、パスワードリセットメールおよびオファーメールのためのEmailOptions
インスタンスを生成しています。実際のアプリケーションでは、メールの本文を動的に生成し、受信者のメールアドレスも動的に取得するでしょうが、このチュートリアルを進めるにあたっては、この設定で問題ありません。
各メールセクションに対応するEmailOptions
オブジェクトが作成された後、LogEmailOptions
関数で設定がログに記録されるので、このコードの結果を見ることができます。
JSONに重複している部分があることにお気づきかもしれません。そこで、デフォルトのセクションを導入します。
.NET CLIを使用して、以下のコマンドでプロジェクトを実行します。
JSONファイルから設定が引き出され、コンソールに出力されていることがわかります。
重複する設定要素のためのデフォルトセクションを追加する
重複する設定要素を削除するために、Defaults
セクションを追加します。appsettings.jsonを開き、Welcome
セクションの前にDefaults
セクションを追加してください。
上記のように、重複するFromEmail
、FromName
、ToEmail
、および ToName
プロパティをWelcome
およびPasswordReset
セクションから削除してください。ただし、Offer
セクションでは重複するToEmail
とToName
プロパティだけを削除して、FormEmail
とFromName
プロパティはそのままにします。
Program.csファイルのコードを以下のように更新し、設定を特定のメールセクションから取得し、NULL(??
)の場合はDefaults
セクションから取得するようにします。
.NET CLIを使用して、プロジェクトを再度実行します。
出力は変わりませんが、特定のセクションで設定を行い、Defaults
セクションから設定をフォールバックできるようになりました。
この方法でもデフォルト設定ができますが、設定セクションを強く型付けされたオブジェクトにバインドすることで、同じ結果をより雄弁に達成できます。
設定バインダーを使ってデフォルト値をバインドおよび上書きする
各設定要素を個別に取得する代わりに、設定バインダーを使用して、設定セクションを強く型付けされているオブジェクトにバインドできます。設定セクションをEmailOptions
のインスタンスにバインドするために使用できるメソッドは2つあります。Get()
とBind(object)
です。
Get
メソッドを使用するには、ジェネリック型の型パラメーターとして希望の型を渡し、 Get
メソッドがそのタイプのインスタンスを作成し、設定をオブジェクトにバインドし ます。
このメソッドを使用するためには、まずEmailOptions
のインスタンスを作成し、そのインスタンスをParameter
に渡します。
さらに興味深いのは、このBind
メソッドを複数回使用できることです。デフォルトとメール固有の設定の両方をバインドしたい場合は、次のようにします。
このテクニックを使用して、ローカル関数を更新してEmailOptions
のインスタンスを作成し、それにDefaults
セクションをバインドし、特定のセクションをバインドしてデフォルトを上書きします。
デフォルトをハードコードする
設定からデフォルト値を引き出すだけでなく、コードに直接デフォルト値を追加することもできます。たとえば、他の人が利用するためのライブラリを開発している場合、一部の設定要素にデフォルト値があると便利ではないでしょうか。
個別の設定要素を引き出すのであれば、このようにデフォルト値を追加することも可能です。
デフォルト値をハードコードするのは意味がないかもしれませんが、設定要素は必要なので、設定要素がnull
であった場合に例外をスローしたいことがあります。その場合、このようにインラインで例外を投げるためにNULL合体演算子を使用することもできます。
しかし、設定バインダーを使う場合は、NULL合体演算子を使う必要はなく、代わりに以下のようにオブジェクトのイニシャライザーでデフォルト値を指定できます。
また、次のようにクラス定義自体にデフォルト値を指定することもできます。
次のステップ
これまでに、デフォルトの設定値をコードで提供する方法と、専用の設定セクションである Defaults
を使用する方法を学びました。さらに、チュートリアル記事「TwilioとC#および.NETのアプリケーションをより良く構成する方法(英語)」と「SendGridとC#および.NETのアプリケーションをより良く構成する方法.net(英語)」を参照して、今回ご紹介した内容を応用することをお勧めします。
もし、このチュートリアルが役に立ったなら、ぜひあなたが今取り組んでいるプロジェクトを共有してください。
Niels Swimbergheは、ベルギー系アメリカ人のソフトウェアエンジニアで、Twilioのテクニカルコンテンツクリエイターです。Nielsへのお問い合わせは、Twitter @RealSwimburgerから、そしてNielsの.NET、Azure、Web開発に関する個人ブログは、swimburger.netでご覧いただけます。