2012-03-30 6 views
2

Ich habe begonnen mit ASP.NET MVC und jetzt ein grundlegendes Verständnis der Verwendung eines Repository-Muster mit meinem EF-Code ersten POCO-Klassen und Ninject für DI.MVC mit Code First mit Validierungslogik und TDD

Ich würde gerne in richtige TDD Gewohnheiten und kämpfen, um vollständig zu verstehen, wie es am besten zu verwenden, zusammen mit, wo einige Logik zu implementieren.

Zum Beispiel habe ich die folgende vereinfachte Klasse 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; } 

Hier ist mein Interface (durch die MVCScaffolding erzeugt)

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(); 
} 

ich, dass die DueDate und CompletionDate validieren möchten sind später als das StartDate. Ich bin mir nicht sicher, ob ich dies mit Datenannotationen machen kann, da es ein bisschen komplex ist, obwohl es nützlich wäre, die unauffällige JavaScript-Validierung in meiner Sicht zu ermöglichen.

Wenn ich Datenanmerkungen verwenden kann, bin ich nicht sicher, wie man Tests für diese Logik schreibt.

Meine andere Idee war, eine Service-Schicht zwischen dem Controller und der Schnittstelle zu erstellen, um diese Validierung durchzuführen, aber dann kann ich keine einfache Möglichkeit zur Client/Server-Validierung oder wie Sie einen Basisdienst implementieren um die Daten wie gewünscht zu validieren.

Ich erwarte im Laufe der Zeit komplexere Varianten und es wäre gut, meine Architektur jetzt "richtig" zu machen.

Antwort

1

Ich würde DataAnnotations verwenden. Ich fand diesen Artikel sehr nützlich auf custom data validations. Von ihm habe ich ein GreaterThanAttribute zu meinem Projekt benutzerdefinierte Validierungen hinzugefügt, sucht der Server-Seite davon wie:

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; 
} 
} 

Die DataAnnotation sich relativ einfach ist und Test zu verspotten.

Verwandte Themen