2010-09-02 2 views
0

Предположим, у меня есть услуга StateService который имеет способ ChangeState.Как и когда применять бизнес-правила?

ChangeState(State toState, DomainObject object) 

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

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

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

ответ

0

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

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

0

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

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

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

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