Должны ли бизнес-объекты или юридические лица быть самопроверенными? - PullRequest
7 голосов
/ 02 марта 2010

Проверка бизнес-объектов является распространенной проблемой, но есть некоторые решения для ее решения.

Одним из таких решений является использование автономной платформы NHibernate.Validator, которая является структурой проверки на основе атрибутов.

Но я сталкиваюсь с концептуальной проблемой. Валидаторы атрибутов, такие как NH.Validator, хороши, но проверка выполняется только при сохранении-обновлении-удалении в сеансе.

Поэтому мне интересно, не должны ли бизнес-объекты самостоятельно проверяться, чтобы поддерживать свою целостность и согласованность?

Ответы [ 3 ]

10 голосов
/ 02 марта 2010

ИМХО - для того, чтобы бизнес-объект (BO) / сущность был действительным, необходимо выполнить 2 шага проверки:

Шаг 1: Самостоятельная проверка BO / Entity - При этом мы проверяем только, является ли объект действительным с точки зрения его состояния F.Ex .: Если установлен почтовый индекс, то имеет ли он действительные символы, имеет ли он действительную длину и т. Д., Образуют проверки уровня BO / Entity. Но за пределами этого уровня проверки мы не сможем сказать, что BO / Entity действительны в вашем бизнес-домене и / или хранилище. Как правило, BO / Entity будет способен обеспечить этот уровень проверки.

Шаг 2: проверка контекста - В этом нам нужно проверить, является ли BO / Entity действительным в контексте хранилища, в котором оно сохраняется. F.Ex .: Действителен ли почтовый индекс для страны, в которой размещается / отправляется заказ и т. Д. Для этой проверки может потребоваться участие некоторых или всех объектов в текущем контексте, чтобы убедиться, что BO / объект действителен.

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

НТН.

6 голосов
/ 02 марта 2010

Хотя они не всегда могут самоутверждаться. Что если вы введете «недействительный» почтовый индекс? Вы можете подтвердить, что почтовый индекс должен быть в определенном формате, но что, если вы хотите, чтобы они были «действительными», то есть «существующими и соответствующими городу»? Или что, если вы принимаете телефонные номера только с определенными кодами городов, а список действительных кодов находится в базе данных, которую ведет юридический отдел?

Если вы можете выполнить семантическую проверку, это здорово и может перейти в бизнес-класс. Но часто вам может потребоваться дополнительная проверка, которую просто невозможно обработать самим бизнес-классом, но она должна обрабатываться классом, который обращается к базе данных и другим внешним службам.

2 голосов
/ 02 марта 2010

Я не знаю, говорим ли мы об одной и той же идее, но если да, мне нравится то, что вы объясняете. Очень быстро я объясню, что я делаю, чтобы решить эту проблему. В моем случае все объекты bussines в слое моего домена должны переопределять два метода:

Очевидно, чтобы поддержать это, я имею в виду больше классов, но я не буду писать все здесь, потому что я только пытаюсь объяснить концепцию

List<ValidationRule> notPassedValidationRules = new List<ValidationRule>();

//...

public override void ValidateErrorsWhenSaving(Validator validator)
{
    //...
}

public override void ValidateErrorsWhenDelete(Validator validator)
{
   //...
}        

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

...