かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Enterprise Library 3.0 Validation Application Block

Enterprise Libraryを入れてからかなり放置してました。
Enterprise Libraryの印象は、ツールで設定ファイルをごりごり書いていくっていうのが強かったけど、Validation Application Blockはそんなことなさげ?
ということで使ってみた!!!

使い方の手順はこんな感じ

  1. 検証したいクラスのプロパティにMicrosoft.Practices.EnterpriseLibrary.Validation.Validators.ValidatorAttributeを派生したAttributeをつける
  2. Microsoft.Practices.EnterpriseLibrary.Validation.ValidationクラスのValidateメソッドを呼び出す
  3. ↑の戻り値のMicrosoft.Practices.EnterpriseLibrary.Validation.ValidationResultsのIsValidプロパティで検証エラーの有無をチェック
  4. えらーがあるときはforeachあたりで検証エラーをValidationResultsから抜き出せる

サンプルコードは↓

using System;
using System.Collections.Generic;
using System.Text;

using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
using Microsoft.Practices.EnterpriseLibrary.Validation;

namespace EntLib
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person();
            // 適当な値をセットして
            p.Age = int.Parse(Console.ReadLine());
            p.Name = Console.ReadLine();

            // 検証を行う
            ValidationResults results = Validation.Validate<Person>(p);
            if (results.IsValid)
            {
                Console.WriteLine("妥当");
            }
            else
            {
                foreach (ValidationResult r in results)
                {
                    // エラーの内容を表示
                    Console.WriteLine("key = {0}, message = {1}, target = {2}", r.Key, r.Message, r.Target);
                }
            }
        }
    }

    class Person
    {
        private int age;

        // 年齢は0歳〜100歳の間
        [RangeValidator(0, RangeBoundaryType.Inclusive, 100, RangeBoundaryType.Inclusive)]
        public int Age
        {
            get { return age; }
            set { age = value; }
        }

        private string name;

        // 名前は10文字以上は駄目
        [StringLengthValidator(10)]
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

    }
}

例えば、年齢に-1を入れてみると↓のようになる

-1
a
key = Age, message = The value must fall within the range "0" (Inclusive) - "100" (Inclusive)., target = EntLib.Person

お手軽だわ。