Как и когда применять бизнес-правила? - PullRequest
0 голосов
/ 03 сентября 2010

Предположим, у меня есть служба StateService , которая имеет метод ChangeState .

ChangeState(State toState, DomainObject object)

У меня есть бизнес-правила, которые проверяют, является ли состояние назначения действительным или нетв текущем «состоянии» объектов домена, как я могу технически проверить эти правила без предварительной установки toState для объекта домена?Сначала неправильно устанавливать новое состояние , запускать проверку и, если одно или несколько нарушений правил сбрасывать состояние .

Одно решение, которое я придумал, - это создатьнекоторый объект контекста, который управляет проверкой, например. ChangeStateContext , который содержит DomainObject вместе с состоянием, которое должно быть установлено.

Другой связанный с этим вопрос - как сообщить о вызове ChageState, как он прошел?
Я могу собрать всеправила проверки, которые нарушают и выдают исключение с теми правилами, которые вызывающий может соответствующим образом перехватить и обработать, или я могу добавить тип возврата в метод ChangeState, например ValidationSummary , который содержит информацию о нарушенных правилах и тому подобное.Какова лучшая практика в этих случаях?

Ответы [ 2 ]

0 голосов
/ 02 марта 2011

Класс DomainObject может иметь метод экземпляра public bool CanChangeState(State toState), возвращающий True, если toState является допустимым переходом из текущего состояния субъекта DomainObject.Такой метод может быть вызван до вызова StateService.ChangeState.

Конечно, если StateService отвечает за проверку изменения состояния, тогда к StateService должен быть добавлен метод CanChangeState(State toState, DomainObject obj).

Чтобы сообщить о сообщениях об ошибках проверки, измените возвращаемый тип CanChangeState на пользовательский тип, отвечающий за сообщение об ошибках проверки.

0 голосов
/ 03 сентября 2010

Не можете ли вы вызвать исключение из метода ChangeState, когда преобразование состояния недопустимо? Вы можете выдавать определенные исключения, такие как StateTransformationException или ValidationException, которые вы можете поймать выше в стеке вызовов. Вы можете при желании добавить дополнительные свойства к этим типам исключений, чтобы вы могли очень точно сообщить, что пошло не так пользователю.

Если вы хотите вызвать несколько ChangeStates после одного пользовательского действия, вам потребуется способ отменить или откатить назад. Обычно я использую шаблон единицы работы (предоставленный мне LINQ to SQL и Entity Framework) и изменяю все состояния в этой единице работы. Когда выдается исключение, я выбрасываю всю единицу работы со всеми ее изменениями.

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