2012-03-26 25 views
1

次のコードに示すように、カスタムバリデーターを使用するモデルクラスがあります。2つの異なるモデルで同じバリデーターを使用する方法

public class Model1 
{ 
    [ApplicationIdentifierValidator()] 
    public Guid ApplicationIdentifier { get; set; } 

    public string ApplicationName { get; set; } 
    public string ApplicationType { get; set; } 
} 

public class ApplicationIdentifierValidator: ValidationAttribute 
{ 
    public ApplicationIdentifierValidator() { } 

    protected override ValidationResult IsValid(object value, ValidationContext context) 
    { 
     Model1 model = (Model1)(context.ObjectInstance); 
     Guid ApplicationIdentifier = model.ApplicationIdentifier; 

     // Validate ApplicationIdentifier value 

     return ValidationResult.Success; 
    } 
} 

ここで、同じバリデーターを使用する必要がある別のモデルクラスを追加しました。 ApplicationIdentifierValidatorは、モデル2のコンテキストで使用されている場合

public class Model2 
{ 
    [ApplicationIdentifierValidator()] 
    public Guid ApplicationIdentifier { get; set; } 

    public Guid SystemIdentifier { get; set; } 
} 

問題はMODEL1

Model1 model = (Model1)(context.ObjectInstance); 

同じバリデータを再利用するためのより良いアプローチ何ができるか任意のアイデアにキャストするとき、それが例外をスローしているのですか?

答えて

1

継承を使用できます。基本的なオブジェクト指向設計は、あなたの正確なニーズを満たすはずです。 2つのモデルをModelBaseから継承させることで、検証コードはオブジェクトをModelBaseにキャストして共有プロパティを使用できます。

abstract class ModelBase{ 
    [ApplicationIdentifierValidator()] 
    public Guid ApplicationIdentifier { get; set; } 
} 

class Model1: ModelBase{ 
public string ApplicationName { get; set; } 
public string ApplicationType { get; set; } 
} 

class Model2: ModelBaes{ 
    public Guid SystemIdentifier { get; set; } 
} 

public class ApplicationIdentifierValidator: ValidationAttribute 
{ 
    public ApplicationIdentifierValidator() { } 

    protected override ValidationResult IsValid(object value, ValidationContext context) 
    { 
     ModelBase model = (ModelBase)(context.ObjectInstance); 
     Guid ApplicationIdentifier = model.ApplicationIdentifier; 

     // Validate ApplicationIdentifier value 

     return ValidationResult.Success; 
    } 
} 
関連する問題