かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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

お手軽だわ。