Шаблон дизайна валидации - PullRequest
6 голосов
/ 07 декабря 2010

Я пишу утилиту проверки данных для одного из наших отделов, которая имеет следующие требования. - Динамически добавление нового бизнес-объекта - Динамическое добавление новых проверок к сущности. - Пользовательский интерфейс для отображения списка бизнес-объекта и их проверки - Пользователь будет иметь возможность начать проверку всей или выбранной бизнес-сущности. - Пользовательский интерфейс будет отображать сообщение об ошибке проверки, если любая проверка не удается. - Система должна перейти к следующей проверке, даже если какая-либо из проверок завершится неудачно, и все настроенные проверки будут проверены.

После поиска в Интернете я обнаружил следующие 2 многообещающих шаблона проектирования, которые удовлетворяют моим бизнес-требованиям: один шаблон id Decorator, а другой - Chain of Command (или Chain of Responsibilty). Теперь мой вопрос: что лучше? У кого-нибудь есть идеи получше?

Спасибо

Ответы [ 2 ]

7 голосов
/ 08 декабря 2010

Я думаю, что вы хотите шаблон спецификации .Таким образом, вы должны сделать что-то вроде этого:

public void StartDateNotInPastSpecification : ISpecification<ISomeBusinessObject>
{
  public bool IsSatisfiedBy(ISomeBusinessObject myBusinessObject)
  {
    return myBusinessObject.StartDate >= DateTime.Now;
  }
}

Хорошая вещь в этом шаблоне заключается в том, что каждое правило легко тестируется в отдельности, и вы можете выбирать, когда применять правила проверки (в отличие от некоторых платформ, которыенавязать вам это решение).

4 голосов
/ 28 апреля 2012

Я тоже использую шаблон спецификации.Это базовая реализация.

public class Specification<T, E> : ISpecification<T, E>
{
    private Predicate<T> predicate;

    public Specification(Predicate<T> predicate)
    {
        this.predicate = predicate;
    }

    public bool IsSatisfiedBy(T candidate)
    {
        return this.predicate.Invoke(candidate);
    }
}

В этой реализации я просто передаю предикат в конструкторе, например:

var specification = new Specification<SomeDomainClass>(x => x.SomeDomainBoolMethod());

Вместо нескольких классов (по одному на каждыйусловия в моем домене), у меня есть несколько методов bool в моих бизнес-объектах.

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