MVC сначала использует код с логикой проверки и TDD - PullRequest
2 голосов
/ 30 марта 2012

Я начал работать с ASP.NET MVC, и теперь у меня есть общее представление об использовании шаблона репозитория с моими классами POCO EF Code First и использовании Ninject для DI.

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

Если я могу использовать аннотации данных, я не уверен, как писать тесты для этой логики.

Моя другая идея состояла в том, чтобы создать сервисный уровень между контроллером и интерфейсом для выполнения этой проверки, но тогда я не могу найти простой способ выполнить проверку на стороне клиента / сервера или как лучше реализовать базовую службу для подтвердите даты, как мне требуется.

Я ожидаю, что со временем у меня появятся более сложные варианты, и было бы хорошо, чтобы моя архитектура была "правильной" сейчас.

1 Ответ

1 голос
/ 31 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...