構成値を配布する
本稿で提案する構成システムには、中央集中データベースから取得した値をローカルのクライアントサーバーに保管しておき、後からローカルで取得できるようにするための非常に簡単なキャッシュ機構が含まれています。プロセスをシンプルで柔軟にするため、図2に示す簡単なクラスフレームワークを利用することで、ローカルクライアントが中央集中データベースから構成値を読み取り、ローカルキャッシュ(Windowsレジストリ)に保管して、常に最新の値を維持できるようにします。
この構成のキャッシュ戦略には重要な長所がもう1つあります。アプリケーションの始動時に中央のストレージシステムを利用できない場合、従来であれば多くのアプリケーション構成値を取得しようとしても、アプリケーションは始動しないか、不安定な状態のままかのいずれかです。そこで、持続性のあるローカルキャッシュを使うことで可用性を向上させます。
このフレームワークの中心となるのは、クライアントアプリケーションがプロパティ値を読み取る場合に使うPropertyValueクラスです。このクラスにより、クライアントは、構成情報がリモートで管理されてローカルにキャッシュされていることを意識せずに済みます。PropertyValueクラスは、まず要求されたプロパティ値をローカルキャッシュでチェックします。値がローカルで見つかった場合は、クライアントに直ちに値を返します。見つからなかった場合は、中央のデータベースから値を取得し、ローカルに保管してから、クライアントに値を返します。
図3に、PropertyValueクラスが使用するフローの概要を示します。

PropertyValueクラスには、キャッシュ内の値が有効期限切れかどうかを判断するLifetimeプロパティがあります。この場合の有効期限とは、単に値を中央のデータベースから再取得する必要があることを意味します。この時効プロセスにより、社内のすべてのマシンでプロパティ値のローカルコピーに対し定期的な更新が適用されます。escPropertyValuesテーブルのValidForフィールドは、ローカルのプロパティ値を次にリフレッシュするまでの秒数を表します。クライアントが有効期限切れの値を要求すると、クラスは中央のデータベースから新しい値を取得し、ローカルの値を更新してから、クライアントに値を返します。
中央のデータベースにアクセスできない状況に対処するため、このクラスは次のように振る舞います。
- プロパティ値がまだローカルに保管されていない場合、PropertyValueクラスはnull値を返します。
- プロパティ値がローカルに保管されているけれども有効期限切れの場合、PropertyValueクラスはローカルに保管されている値を返します。
このスキームにより、データをできる限り最新の状態に維持しつつ、中央のデータベースサーバーにアクセスできない不測の事態が生じた場合もプロパティ値をできる限りローカルで取得できるようにします。
拡張性
読者の中には、このソリューションで中央のリポジトリにSQL Serverを使用していることに異議を唱える方もいるでしょう。プロパティのローカルリポジトリとしてWindowsレジストリを使っていることに異議を唱える方はもっと多いかもしれません。個人的には、これらはストレージとしておそらく最適な万能の選択肢であると考えますが、図2に示すクラスフレームワークは、ローカルストレージにおいてもリモートストレージにおいても交換可能な互換性をサポートしています。ほとんどの場合、プロパティ値の中央リポジトリとして使用するならばSQL Serverなどのエンタープライズクラスのリレーショナルデータベースが最適な選択肢だと思われますが、サーバーでWebアプリケーションを実行することが多い場合は、ローカルストレージにASP.NETキャッシュを採用する方がよいかもしれません。
LocalStorageClientとRemoteStorageClientに組み込まれている拡張性のメカニズムの働きはほとんど変わりません。このフレームワークは、他のローカルやリモートのストレージメカニズムをサポートするように簡単に拡張することができます。たとえば、ローカルの構成プロパティをXMLファイルに保管するとしましょう。手順は次のとおりです。
まず、LocalStorageClientを継承する新しいクラスを作成し、LocalPropertyValue_GetとLocalPropertyValue_Setという2つのmustoverride(オーバーライド必須)メソッドを実装します。これらの2つのメソッドは、PropertyValueオブジェクトをローカルで読み取り/書き込みます。ストレージにXMLファイルを使うには、XMLファイルのオープンとクローズ、XMLファイルの読み取りと書き込みなどをサポートするコードを作成する必要があります。LocalStorageClient基本クラスのBuildPropertyValueメソッドは、XMLファイルから取得した値からPropertyValueクラスを構築する場合に役立ちます。
RemoteStorageClientで使われるメカニズムへの参照はないことに注意してください。また、ローカルに保管されている値が有効期限切れかどうかをチェックする場合に使うコードもありません。これは、PropertyValueクラスがこれらの処理を受け持つためです。プロパティ値をリモートストレージから更新しなければならない場合、PropertyValueクラスは、図3に示すように、RemoteStorageClientとLocalStorageClient間の対話を調整します。
サンプルプロジェクトを使用する
本稿のダウンロードサンプルには、中央のSQL Serverデータベースからプロパティ値を取得して、ローカルのコンピュータのレジストリに保管する、完全に機能するプロジェクトが収められています。ローカルに保管されたプロパティ値は、escPropertyValueテーブル内のValidForの設定値に従い、SQL Serverシステムから取得した値でリフレッシュされます。
PropertyValueクラスのGetValue共有メソッド関数の呼び出しがシステムへのエントリポイントです。GetValueには、ModuleIDと、取得対象のプロパティの名前のみを渡す必要があります。RemoteStorageClientクラスがサーバー名を取得するので、テーブルはそのサーバー名を使用してロケーションを推測することができます。システムは、要求されたプロパティの値をローカルストレージまたはリモートストレージのいずれかから取得できる場合、そのプロパティのPropertyValueオブジェクトを返します。

