Сначала:
база данных SQL, очевидно, проверит данные, прежде чем я попытаюсь
вставить его
Нет, не будет. Если вы передаете его через параметр, он будет усечен. Если вы выполняете прямой SQL-оператор, вы получите ошибку после , когда вы запустите вставку.
Тем не менее, мы добавляем валидаторы к нашим объектам через атрибуты и позволяем проверке Enterprise Library перед попыткой передать данные на наш db-сервер. Это позволяет нам настраивать сообщение для каждого свойства и на нескольких языках.
Пример:
using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
namespace MyApp.ObjectModel {
public class Account {
private String _accountNumber = String.Empty;
[StringLengthValidator(1, 50, MessageTemplateResourceName="ValidationStringLength", MessageTemplateResoourceType = typeof(MyApp.Properties.ErrorMessages), Tag="Account Number")]
public String AccountNumber {
get { return _accountNumber; }
set { _accountNumber = value; }
}
protected Validator BuildValidator() {
return ValidationFactory.CreateValidator<Account>();
} // method::BuildValidator
public String Validate() {
Validator internalValidator = BuildValidator();
ValidationResults info = internalValidator.Validate(this);
String result = String.Empty;
if (!info.IsValid) {
foreach(ValidationResult vr in info) {
result += vr.Message;
}
}
return result;
} // method::Validate
public Boolean Save() {
if (String.IsNullOrEmpty(Validate()) {
// perform the save operation.
} else {
// do something else, log the message or send it back to the screen or whatever.
}
}
} // class::Account
}
Приведенный выше класс является очень простым примером использования валидаторов Enterprise Library. Основными вещами, которые нужно от этого избежать, является атрибут в свойстве AccountNumber, который в основном говорит, что номер счета должен содержать от 1 до 50 символов.
Мы поместили метод Validate () в базовый класс, который вызывается при каждом сохранении данных. Также наш метод validate фактически возвращает коллекцию ошибок, которые мы фильтруем для того, что пытается сохранить объект. Далее мы используем шаблон Inversion of Control для передачи соответствующего интерфейса уровня данных самому объекту. Таким образом, опять же, мы можем сохранить объекты, сохраняя логику внутри себя, при этом поддерживая возможности имитации, а также возможность по своему усмотрению менять механизмы сохранения (то есть: серверы баз данных). Это не представлено в примере кода выше.
По сути, это позволяет нам сохранять логику валидации в бизнес-классе, в то время как любой другой уровень может не знать об этом и просто фильтровать любые ошибки в соответствующем месте (обычно это область сообщений на экране). Если у вас есть специальная логика валидации, добавить обычные валидаторы и добавить атрибуты там, где они необходимы, довольно тривиально.
И последнее, что каждый уровень может вызывать метод validate () в любое время, а не только во время операции сохранения, для обеспечения согласованности данных.