[seasar-dotnet:783] Re: DTOの入力値検証について

Masayuki TAMADA [E-MAIL ADDRESS DELETED]
2008年 3月 4日 (火) 00:11:26 JST


タマダです。

ボクは以下の様に実装することで、AOPでジョインポイントに対し、
検証用のbeforeアドバイスを利用して引数のDTOを検証する様にしています。

1. DTOのプロパティ毎の検証は、検証用の汎用属性クラスを作成し、
   各プロパティに仕掛ける様にしています。
   
2. また、DTOクラス内のプロパティ間の検証については、DTOクラスと共に
   インナークラスとして、クラス検証用の検証クラスを作成してDTOクラスに
   仕掛ける様にしています。
   
イメージだけで申し訳ないですが、以下の様な感じになります。


[PersonDtoValidator]
public class PersonDto {
        <snip>
        
        [IntRangeValidator(0, 120)]
        public int Age 
        {
                <snip>
        }
        
        [NotNullValidator]
        [StringLengthValidator(10, 70)]
        public string Name 
        {
                <snip>
        }
        

}

class PersonDtoValidatorAttribute : Attribute {

        public void DoValidate(object target) {
        
                PersonDto dto = target as PersonDto;
                if ( dto == null) 
                {
                        throw new ArgumentException();
                }
                
                ここにプロパティ間の検証内容を実装します。
        }
}


あとは、検証発火用のinterceptorと.diconファイルの作成のみでOKです。

# どの様な順番で検証するか等は各仕様があるかと思いますので、ここでは
# 記述しません。

結局DTOの変更が行われる場合、プロパティの検証に関しても、プロパティ間の
検証に関しても変更は行われるものだと思います。
汎用の属性クラスやインナークラスを利用することで、該当のDTOクラスの
ファイルのみ変更する事で修正完了ですし、見通しが良いものになるかと。


参考になれば。



On Mon, 3 Mar 2008 20:02:50 +0900
[E-MAIL ADDRESS DELETED] wrote:

 # お世話になっております。藤井と申します。
 # 
 # 最近、S2.NETを勉強し始めたばかりです。
 # 
 # S2.NETとは直接、関係ない質問になると思いますが、
 # DTOへの入力値検証について、皆様はどのように実装されていますでしょうか?
 # 
 # DTOへVaridateメソッド等を組み込むと、DTOでなくなるように思いますし、
 # Varidateクラスを作成したとしても、DTOが変更になれば、変更する必要があると
 # 思います。
 # 
 # DTOの属性等で何かできないものかと考えていますが、なにぶん、
 # 初心者なもので、なかなかできません。
 # 
 # 一般的なDTOへの入力値検証方法をアドバイス頂ければ幸いです。
 # 
 # 以上、宜しくお願いいたします。
 # _______________________________________________
 # seasar-dotnet mailing list
 # [E-MAIL ADDRESS DELETED]
 # https://ml.seasar.org/mailman/listinfo/seasar-dotnet




seasar-dotnet メーリングリストの案内