2012-03-30 5 views
2

私はASP.NET MVCを使い始めていますが、今ではEF Code First POCOクラスでリポジトリパターンを使用し、DI用にNinjectを使用することについて基本的に理解しています。MVCコードをValidation LogicとTDDで使用する

私は、適切なTDDの習慣を身につけて、ロジックを実装する場所と一緒に使用するのが最善であるかどうかを完全に理解したいと思っています。例えば

私は、以下の単純化されたPOCOクラスがあります。ここでは

public int ProjectID { get; set; } 
    [Required] 
    [MaxLength(150)] 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public DateTime? StartDate { get; set; } 
    public DateTime? DueDate { get; set; } 
    public DateTime? CompletionDate { get; set; } 

    public virtual ICollection<ProjectCode> ProjectCodes { get; set; } 
    public virtual ICollection<ProjectTask> ProjectTasks { get; set; } 

は、私はDueDateとCompletionDateであることを検証したいと思い、私のインターフェイス(MVCScaffoldingによって生成された)

public interface IProjectRepository 
{ 
    IQueryable<Project> All { get; } 
    IQueryable<Project> AllIncluding(params Expression<Func<Project, object>>[] includeProperties); 
    Project Find(int id); 
    void InsertOrUpdate(Project project); 
    void Delete(int id); 
    void Save(); 
} 

ですStartDateより遅い私は私の視野でうまくいかないjavascriptの検証を有効にするのに便利だが、ちょっと複雑なのでデータアノテーションを使ってこれを行うことができるかどうかはわからない。

データアノテーションを使用できるのであれば、このロジックのテストを書く方法についてはわかりません。

私の他のアイデアは、この検証を実行するためにコントローラとインターフェイスの間にサービスレイヤーを作成することでしたが、クライアント/サーバー側の検証を行う簡単な方法や、基本サービス私が必要とする日付を検証する。

私はこれ以上の複雑なバリエーションを予定しています。今は自分のアーキテクチャを「正しい」ものにするのが良いでしょう。

答えて

1

私はDataAnnotationsを使用します。この記事はcustom data validationsで非常に役に立ちました。それから、私はGreaterThanAttributeは私のプロジェクトのカスタム検証に追加した、サーバ側ではそのようになります。

public class GreaterThanAttribute : ValidationAttribute{ 

public GreaterThanAttribute(string otherProperty) 
    : base("{0} must be greater than {1}") 
{ 
    OtherProperty = otherProperty; 
} 

public string OtherProperty { get; set; } 

public override string FormatErrorMessage(string name) 
{ 
    return string.Format(ErrorMessageString, name, OtherProperty); 
} 

protected override ValidationResult 
    IsValid(object firstValue, ValidationContext validationContext) 
{ 
    var firstComparable = firstValue as IComparable; 
    var secondComparable = GetSecondComparable(validationContext); 

    if (firstComparable != null && secondComparable != null) 
    { 
     if (firstComparable.CompareTo(secondComparable) < 1) 
     { 
      return new ValidationResult(
       FormatErrorMessage(validationContext.DisplayName)); 
     } 
    } 

    return ValidationResult.Success; 
} 

protected IComparable GetSecondComparable(
    ValidationContext validationContext) 
{ 
    var propertyInfo = validationContext 
          .ObjectType 
          .GetProperty(OtherProperty); 
    if (propertyInfo != null) 
    { 
     var secondValue = propertyInfo.GetValue(
      validationContext.ObjectInstance, null); 
     return secondValue as IComparable; 
    } 
    return null; 
} 
} 

DataAnnotation自体が偽およびテストする合理的に簡単です。

関連する問題