目次
ビルド構成を作成し条件付きコンパイルを使うと各ビルド構成によってコンパイルするコードを変更することができます。今回はビルド構成を利用してサーバのエンドポイントとローカルデータベースを変更する方法について解説します。
ビルド構成を作るメリット
まず、ビルド構成でサーバのエンドポイントとローカルデータベースを切り替えられるようにするメリットについて説明します。
サーバのエンドポイントを切り替えられるようにする理由は、開発中に本番サーバに接続してデバッグするとサービス利用者のデータを削除してしまう恐れがあるからです。そのため開発中は
いつも同じ値を返すモックサーバか
本番サーバと同じ動作を行うステージングサーバ
に接続し、リリース時のみ本番サーバをエンドポイントにします。
ローカルデータベースを仮想データベースか組込データベースに切り替えられるようにする理由は、開発初期段階でデータベース構成に関するソースコード変更する度にマイグレーションを実行する手間を省くためと実行時にテーブルを常に空の状態で開始したいためです。2つのデータベースの違いは、
組込データベースはマイグレーションが必要で実行後にデータが残り、
仮想データベースでマイグレーションが不要で実行後にデータは残りません。
そのため、開発処理段階では仮想データベースを使って開発し、データベース構成が固まったら、組込データベースに切り替えられる設計で開発します。
事前準備
それでは、ビルド構成と条件付きコンパイルを作成する手順について説明しますが、詳しい説明は公式サイトのほうが詳しいので、ここでは簡単に説明します。
ビルド構成の作成
VisualStudioの左上にあるプルダウンから下記画像になるようにStagingとMockを作ります。
ビルド構成を追加する方法はプルダウンメニューの構成マネージャーから下記ウィンドウから追加できます。
詳しい説明は下記の公式リファレンスへ
ビルド構成について
条件付きコンパイルの作成
プリプロセッサ ディレクティブ(#if,#elif,#else,#elif)を使ってビルド構成によってコンパイルするコードを変更させます。下記はビルド構成によって依存性を注入するエンドポイントを切り替えるサンプルコードです。
public static class HttpClientBuilderExtentions
{
public static void AddProvider<TServices>(this IHttpClientServicesBuilder builder) where TServices : IHttpClientServices
{
#if DEBUG || RELEASE
builder.AddConfiguration<TServices>(new ProductUrl());
#elif MOCK
builder.AddConfiguration<TServices>(new MockUrl());
#elif STAGING
builder.AddConfiguration<TServices>(new StagingUrl());
#endif
}
}
詳しい説明は下記の公式リファレンスへ
C# プリプロセッサ ディレクティブ
構成内容
上記の手順で、Debug,Mock,Staging,Releaseの4つの構成を作成します。テストプロジェクトと違ってリリースするプロジェクトは仮想データベースやモッククラスといったテスト用のコードを含んでいるプロジェクトを参照していないため、
テスト用のコードを含んでいるテストプロジェクト用の構成一覧と
テスト用のコードを含ませないリリースプロジェクト用の構成一覧
でプロジェクトによって構成が下記の2つに分かれます。
構成名 | コードの最適化 | サーバ | データベース |
Debug | なし(モッククラス) | 仮想データベース or Sqlite *1 | |
Mock | モックサーバ | 仮想データベース or Sqlite *1 | |
Staging | ステージングサーバ | 仮想データベース or Sqlite *1 | |
Release | 〇 | 本番サーバ | 仮想データベース or Sqlite *1 |
構成名 | コードの最適化 | サーバ | データベース |
Debug | 本番サーバ | Sqlite | |
Mock | モックサーバ | Sqlite | |
Staging | ステージングサーバ | Sqlite | |
Release | 〇 | 本番サーバ | Sqlite |
*1 テストプロジェクトで仮想データベースかSqliteのどちらを使うか設定ファイル(setting.json)で変更できるようにします。
さいごに
参画した案件でHttpクライアントとローカルデータベースを使ったアプリ開発のビルド構成はこんな感じで落ち着きました。