2010-12-07 2 views
6

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

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

Благодаря

+0

Я думаю, вам может потребоваться перефразировать ваш вопрос. Можете ли вы четко указать, что вы хотите сделать, скажем, в схеме Chain of Command? – 2010-12-07 12:54:33

ответ

7

Я думаю, что вы хотите это Specification Pattern. Таким образом, вы могли бы сделать что-то вроде этого:

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

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

4

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

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 методы мои бизнес-объекты.

+0

не могли бы вы добавить/переписать пример кода использования, чтобы включить более объяснительные имена классов/методов? – 2018-01-18 08:55:46

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