特集
Enterprise Library 3.0概説(後編)

EntLib 3.0の注目の新機能を実装サンプルで見てみよう

アバナード株式会社 市川 龍太(Microsoft MVP − Solutions Architect)
2007/07/13
Page1 Page2 Page3 Page4

 本特集前編では、Enterprise Library 3.0(以下EntLib 3.0)の新機能について、主に既存のApplication Blockに追加された機能を中心に解説した。

 後編となる今回では、EntLib 3.0から新たに追加された、

  • Validation Application Block(以下VAB)
  • Policy Injection Application Block(以下PIAB)
  • 独自のApplication Blockの開発を支援するApplication Block Software Factory(以下ABSF)

について解説する。前編を読んで、まだ消化不良に思われた読者も多いことと思うが、本稿を読んでもらえれば「EntLib 3.0が従来の共通ライブラリのセオリーを超えた」という言葉の真意をご理解いただけるだろう。

 それでは、VABから解説していくことにしよう。

Validation Application Block(VAB)

 VABとは文字どおりバリデーション(=検証)を行うためのApplication Blockなわけだが、.NETが標準で提供しているValidator(=RequiredFieldValidatorなどの検証コントロール)がWebページから入力される値の正常性を確認することを目的としているのに対して、VABはカスタム・クラスが備えるプロパティ値の正常性を確認することを主たる目的としている。もちろん画面から入力された値の検証にも利用することは可能である。

 VABでバリデーションを行う方法には次の3種類がある。

    (1)Validatorクラスを使う方法
    (2)Validator属性を使う方法
    (3)構成ファイルを使う方法

(1)Validatorクラスを使う方法

 まずはVABのValidatorクラスを使ったサンプル・コードを以下に示す。ここではValidatorクラスの派生クラスであるStringLengthValidator、ContainsCharactersValidator、AndCompositeValidatorの3つのクラスを利用している(標準で利用可能な派生クラスの一覧は後述)。

Validator<string> lengthValidator = new StringLengthValidator(
  1, RangeBoundaryType.Inclusive,
  10, RangeBoundaryType.Exclusive,
  "1文字以上10文字未満");

Validator containsValidator = new ContainsCharactersValidator(
  "EntLib", ContainsCharacters.All);

Validator lastNameValidator = new AndCompositeValidator(
  lengthValidator, containsValidator);

string message = "検証文字列";
ValidationResults results = lastNameValidator.Validate(message);

if (!results.IsValid)
{
  foreach (ValidationResult error in results)
  {
    this.Label1.Text = error.Message;
  }
}
else
{
  this.Label1.Text = "入力OK";
}
VABのValidatorクラスを使って検証を行うサンプル・コード

 このサンプル・プログラムでは、StringLengthValidatorクラスで文字列の長さが1文字以上10文字未満であることが定義され、ContainsCharactersValidatorクラスで“EntLib”という文字のすべてが含まれていることが定義されている。

 そしてこれら両ValidatorオブジェクトをAndCompositeValidatorクラスに渡すことで、両方の条件をともに満たしているか否かが検証条件として設定されるのである。ちなみにこれをOrCompositeValidatorクラスに渡せば、どちらか1つの条件を満たしているか否かが検証条件となる。

 検証の結果はValidationResultオブジェクトのコレクション(ValidationResultsオブジェクト)として返され、その各要素を取り出すことで、検証エラーの詳細内容を参照することができるのである。

(2)Validator属性を使う方法

 次にValidator属性を使った場合のサンプル・プログラムを以下に示す。ここではValidator属性(ValidatorAttributeクラス)の派生クラスとして定義されているNotNullValidator属性、StringLengthValidator属性、RegexValidator属性を利用している。

public class Customer1
{
  private string firstName;
  private string lastName;
  private string email;

  [NotNullValidator(MessageTemplate = "名は必須入力項目です")]
  [StringLengthValidator(1, 10, MessageTemplate = "名は1文字以上10文字以下です")]
  public string FirstName
  {
    get { return firstName; }
    set { firstName = value; }
  }

  [NotNullValidator(MessageTemplate = "姓は必須入力項目です")]
  [StringLengthValidator(1, 10, MessageTemplate = "姓は1文字以上10文字以下です")]
  public string LastName
  {
    get { return lastName; }
    set { lastName = value; }
  }

  [RegexValidator(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", MessageTemplate = "不正なメールアドレスです")]
  public string Email
  {
    get { return email; }
    set { email = value; }
  }
}

static void Main(string[] args)
{
  Customer1 customer = new Customer1();
  ValidationResults results = Validation.Validate(customer);
}
Validator属性を使って検証を行うサンプル・プログラム

 先ほどのサンプル・プログラムでは、各ValidatorオブジェクトをAndCompositeValidatorクラスに登録する必要があり、コードが冗長になりがちである。

 Validator属性を使ったサンプル・プログラムでは、Customerクラスの各プロパティにVABが提供するカスタム属性を付与しておき、後はValidationクラスのValidateメソッドにCustomerクラスのオブジェクトを渡すだけで同様のバリデーションを行うことができるのである。

 ちなみに各属性に渡す値(例えば文字列の長さなど)は「The Enterprise Library Configuration Console」(以下Configurationコンソール)を使って外部から設定することができるため、検証パターンの変更をプログラムレスで行うことが可能である。

(3)構成ファイルを使う方法

 さらに次に挙げる構成ファイルを使った方法であれば、プログラムに一切のコードを追加せずに検証を行うことが可能になる。

public class Customer2
{
  private string firstName;
  private string lastName;
  private string email;

  public string FirstName
  {
    get { return firstName; }
    set { firstName = value; }
  }

  public string LastName
  {
    get { return lastName; }
    set { lastName = value; }
  }

  public string Email
  {
    get { return email; }
    set { email = value; }
  }
}

static void Main(string[] args)
{
  Customer2 customer = new Customer2();
  ValidationResults results = Validation.Validate(customer);
}
構成ファイルを使って検証を行うサンプル・プログラム
検証には構成ファイルの設定が必要となる。これはConfigurationコンソールか、EntLib 3.0から利用可能なVisual Studio-integrated Configuration Editorを使用する。

 構成設定(=構成ファイルへのVAB設定の登録)は、Configurationコンソールを使って行えるが、EntLib 3.0からは新しくVisual Studio-integrated Configuration Editor(以下Configurationエディタ)が提供されたため(詳しくは前編を参照)、今回はこれを使ってVisual Studio 2005(以下VS 2005)から構成設定を行うことにする。

VS 2005からのVABの構成設定
VS 2005上で構成設定を行うには、設定を追加したい構成ファイルを右クリックして表示されるコンテキスト・メニューから[Edit Enterprise Library Configuration]を選択すればよい。
  VABを追加する。これを行うには、構成ファイルへのパスが表示されているノードの上で右クリックしてコンテキスト・メニューを表示し、そこから[New]−[Validation Application Block]を選択すればよい。これにより「Validation Application Block」ノードが追加される。

 ここで先ほどのサンプル・プログラム上で定義されているCustomer2クラスの各プロパティとConfigurationエディタ上のノード名が一致していることに注意してほしい。

 これは、ValidationクラスのValidatorメソッドにCustomer2クラスのオブジェクトが渡されると、構成ファイルに定義されている設定を基にプロパティとノード名のマッチングが行われ、両者が完全に一致した場合のみ、それ以下に定義されているValidatorノードの検証が実行されるからである。

 なお、各Validatorクラスの設定は、次の画面のようにVS 2005のプロパティ・ウィンドウを使用して行う。

プロパティ・ウィンドウによる各ノードの設定

 最後にVABが標準で提供しているValidatorクラス/属性の一覧を以下に示す。

Validator名 検証内容
And Composite Validator 指定されたすべてのValidatorを連結し、すべての検証が正常であるか否かを検証する
Contains Characters Validator 任意の文字を含んでいるか否かを検証する
Date Time Range Validator 指定された日付が範囲内か否かを検証する
Domain Validator<t> 任意の値が指定された値のセットに含まれているか否かを検証する
Enum Conversion Validator 任意の値が指定された列挙型に変換可能であるか否かを検証する
Not Null Validator 任意の値がNULL値であるか否かを検証する
Object Validator コンストラクタに任意のValidatorの型情報を渡すことで、そのValidatorと同様の検証を実行できる
Object Collection Validator コンストラクタに任意のValidatorの型情報を渡すと、それが一度コレクションに格納され、各要素のValidatorと同様の検証を順に実行することができる
Or Composite Validator 指定されたすべてのValidatorを連結し、いずれかの検証が正常であるか否かを検証する
Property Comparison Validator ほかのプロパティ値と比較を行い、特定の条件を満たしているか否かを検証する
Range Validator<t> 任意の数値が特定の範囲内であるか否かを検証する
Regular Expression Validator 任意の値が正規表現にマッチしているか否かを検証する
Relative Date Time Validator 任意の日付が相対時間内であるか否かを検証する
String Length Validator 任意の文字列の長さが指定された範囲内であるか否かを検証する
Type Conversion Validator 任意の値が指定された型に変換できるか否かを検証する
VABが標準で提供するValidatorクラス/属性一覧
この表にあるValidator名は、ConfigurationコンソールやConfigurationエディタなどの構成ツールで表示される名前を掲載している。具体的なクラス名や属性名は、(基本的に)単語間のスペースを削除したものとなる。詳細についてはEntLib 3.0に付属のリファレンス・マニュアルを参照していただきたい。
 

 INDEX
  [特集]Enterprise Library 3.0概説(前編)
  自身のセオリーから飛び出した新生EntLib 3.0とは?
    1.EntLib 3.0とは?
    2.EntLib 2.0と3.0の相違点
    3.EntLib 3.0から新しく追加された機能(1)
    4.EntLib 3.0から新しく追加された機能(2)
 
  [特集]Enterprise Library 3.0概説(後編)
  EntLib 3.0の注目の新機能を実装サンプルで見てみよう
  1.Validation Application Block(VAB)
    2.VABのSelf Validation機能/ASP.NET統合
    3.Policy Injection Application Block(PIAB)
    4.Application Block Software Factory(ABSF)
 
インデックス・ページヘ  「Enterprise Library」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH