2012-03-30 4 views
2

Я начал работу с ASP.NET MVC и теперь имею базовое понимание использования шаблона репозитория с моими классами EF Code First POCO и использованием Ninject for DI.MVC с использованием кода сначала с логикой проверки и 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; } 

Вот мой интерфейс (генерируется 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(); 
} 

Я хотел бы подтвердить, что DueDate и CompletionDate является позже, чем StartDate. Я не уверен, могу ли я сделать это с помощью dataannotations, поскольку он немного сложный, хотя было бы полезно разрешить ненавязчивую проверку 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 довольно просто издеваются и испытание.

Смежные вопросы