ビジネスルールを外部で保守する
これは本稿の検証エンジンの機能で最も重要な部分ですが、Visual Studio 2005のビジュアルデザイナを使えば非常に簡単に実現できます。とはいえ、学ぶことがないわけではありません。.NETでの永続的な設定については、MSDNライブラリの『方法 : アプリケーション設定を追加または削除する』などを参照してください。
簡単に言えば、.NETは永続的な設定をローカルシステム上のapplication.exe.configまたはuser.configのいずれかに格納します。これらの設定にアクセスするには、コード内でProperties.Settings.Defaultオブジェクトを使用するか、プロジェクトプロパティの[Settings]ペインのビジュアルデザイナを使用します。ビジネスルールを永続的な設定として格納するということは、それらのルールをuser.configファイルに入れ、必要に応じて自由に編集できる、ということです。さらに一歩進めて、永続的な設定をWindowsフォーム上のコントロールに直接バインドし、ビジネスルールを編集するためのユーザーフレンドリなインターフェイスを作成することも可能です。つまり、ユーザーがフォームの値を編集したときに、その値が自動的にuser.configに格納されるようにすることができます。
Visual Studio 2005のビジュアルデザイナでは、コードから独立した形でアプリケーションのユーザーインターフェイス層にアクセスすることができます。ビジュアルデザイナ上での操作はコードに自動的に反映されますが、形としては別々に保持されています。フォーム検証用のビジネスルールは、当然、ユーザーインターフェイスに密接に結び付けられます。つまり、フォーム上のコントロールのほとんどに1つ以上の固有のフォーム検証用のビジネスルールが割り当てられます。では、ユーザーインターフェイスを指定するビジュアルデザイナで検証用のビジネスルールを指定してはどうでしょうか。
ビジュアルデザイナには、フォーム上のコントロールごとにプロパティペインが用意されています。ここで必要なことは、プロパティとしてビジネスルールを追加することだけです。しかし、プロパティペインにはプロパティを追加することができないので、そこが問題です。この問題を簡単に回避する1つの方法は、ユーザー定義可能なプロパティとして提供されているTagプロパティを使用することです。このようなプロパティは1つのコントロールにつき1つだけなので、複数のビジネスルールを1つのパッケージにまとめて、Tagプロパティコンテナに割り当てるようにします。このスキーマを使うことで、コントロールを定義するときにビジネスルールを定義し、永続的な設定と組み合わせてビジネスルールを外部化することができます。
ビジネスルールに関連付けるには、検証対象の各コントロールに、次のような形式の一連の属性から構成されるTagプロパティ値を割り当てます。
<attr1>=<value1>;<attr2>=<value2>;...;<attrn>=<valuen>
さらに高度なソリューションとして、ExtenderProviderコントロールを使って、利用可能な属性に対応する実際のプロパティを定義し、Tagプロパティを他の用途に使えるように解放しておく方法もありますが、ここでは簡潔かつシンプルにしておくことにしました。
表1に、利用可能な属性とその型を示します。
| 属性 | 値 | 説明 |
maxLen | int > 0 | フィールド内の文字数は指定された数以下でなければならない。 |
minLen | int > 0 | フィールド内の文字数は指定された数以上でなければならない。 |
maxVal | Float | フィールド内の数字は指定された値以下でなければならない。 |
minVal | Float | フィールド内の数字は指定された値以上でなければならない。 |
pattern | 正規表現 | フィールドは指定された正規表現に一致しなければならない。 |
最初の2つ(minLenとmaxLen)では、文字列として取得する値の長さを制御することができます。同様に、その次の2つ(minValとmaxVal)では、数値入力の範囲を制御することができます。最後の属性(pattern)には、正規表現の引数が必要です(正規表現については『Regular-Expressions.info』を参照)。ニーズに合わせて属性を「組み合わせて一致」させることができます。表2に、役に立つ一般的な属性の組み合わせを示します。minValとmaxValで表すことができる制約は、正規表現のpatternでも表すことができます。
| 属性の一覧 | 意味 |
maxLen=10 | 値は10文字以下でなければならない。 |
minVal=0 | 値を負にすることはできない。 |
minVal=0;maxVal=100 | 値は0以上100以下でなければならない。 |
minLen=1 | 値は非空でなければならない。 |
pattern=. | 値は非空でなければならない。 |
minLen=5;maxLen=5 | 値はちょうど5文字でなければならない。 |
pattern=.{5} | 値はちょうど5文字でなければならない。 |
pattern=^\S+$ | 値にスペースを入れることはできない。 |
pattern=^-?(?:\d*\.?\d+|\d+\.)$ | 値は数値でなければならない。 |
pattern=^\d{3}-\d{3}-\d{4}$ | 値は標準的な米国内の電話番号でなければならない。 |
pattern=^\w[\w\.]*\@\w+\.\w[\w\.]*$ | 値は電子メールアドレスでなければならない。 |
Visual Studioのビジュアルデザイナでフォームをデザインしながら、各コントロールのプロパティペインにビジネスルールを入力することができます。次に、そのプロパティをアプリケーション設定に関連付け、アプリケーションが実行されたときに外部化されるようにする必要があります。ステップは次のとおりです。
まず、コントロールのTagプロパティにビジネスルールを入力します。次に、プロパティペインで[(ApplicationSettings)]項目を探します(プロパティペインがカテゴリ別に分類されている場合は、[Data]ノードの下にあります)。[(ApplicationSettings)]を展開すると[(PropertyBinding)]項目が表示されます。値フィールドをクリックすると、プロパティエディタを表示するための省略記号([...])ボタンが表示されます(図3を参照)。また、Tagプロパティにはpattern型のビジネスルール(正規表現)が入力されています。

[(PropertyBinding)]の省略記号ボタンをクリックします。選択したコントロールに関する[Application Settings]ダイアログボックスが開きます(図4を参照)。このダイアログボックスを使って、プロパティ値をコントロールの個々のアプリケーション設定に割り当てます。

Tagプロパティを探して、対応するドロップダウンリストを開き、[New]をクリックします。リスト内のTagプロパティに入力した値が、既定値(DefaultValue)として表示されます(図5を参照)。[Name]には、この新しい設定の名前を入力します。例えば図5では、この設定はサンプルアプリケーションのleftTextBoxコントロールに関連付けられているので、「leftTextBoxBusinessRules」という名前を使いました。[Scope]には、「Application」または「User」を指定します。「Application」を指定した場合、この設定の値はprogram.exe.configに格納され、単一のコンピュータ上のすべてのユーザーに共通の読み取り専用の値となります。「User」を指定した場合、この設定の値はプログラム内で変更可能になり、変更した値はユーザーの「Application Data」フォルダ内のユーザー固有のuser.configファイルにオーバーライドとして格納されます。

[OK]をクリックして[New Application Setting]ダイアログボックスを閉じ、再度[OK]をクリックして[Application Settings]ダイアログボックスを閉じます。これでプロパティペインは図6のようになります。先ほど入力したTagプロパティの値が削除されて代わりに小さいアイコンが表示され、[(ApplicationSettings)]セクションの下にTagプロパティが指定の名前で表示されていることに注意してください。プロパティをアプリケーション設定に割り当てると、そのプロパティ(この場合はTag)はプロパティペインの[(ApplicationSettings)]項目の下に移動し、元のプロパティ値は小さいアイコンに置き換えられます。

理論上は、これでプロパティのバインディング作業は終わりですが、実際にはまだ終わっていません。実行しなければならないステップがもう1つあります。プロジェクトプロパティウィンドウの[Settings]タブを開いてください。leftTextBoxコントロールの例で言えば、先ほど作成したleftTextBoxBusinessRulesの設定が表示されているはずですが、図7を見ると、Tagプロパティの値(ビジネスルール)がプロジェクトプロパティウィンドウの[Settings]ペインから消えています。
Tagプロパティをアプリケーション設定に割り当てたときに、Visual StudioがコントロールのTagプロパティから値を削除したのです。そのため、このアプリケーション設定の既定値として指定されていても、プロジェクトプロパティウィンドウの[Settings]タブには表示されません。
これを表示するのは簡単です。設定の型をSystem.Objectからstringに変更するだけで、既定値が表示されます(図8を参照してください)。


