Замечательный проект затеял Dario Quintana в следующей версии библиотеки дополнений NHibernate Contrib:
Его предназначение - декларирование и централизованная проверка правил валидации где-нибудь поближе к модели домена.
Например, правила можно описывать в виде атрибутов:
public class User { public virtual int Id { get { return id; } } [NotEmpty, NotNull] public virtual string UserName { get { return userName; } set { userName = value; } } [Email] public virtual string Email { get { return email; } set { email = value; } } [Past] public DateTime CreatedDate { get { return createdDate; } set { createdDate = value; } } [Min(18, Message="You are to young!")] public int Age { get { return age; } set { age = value; } } [CreditCardNumber] public string CreditCardNumber { get { return creditCardNumber; } set { creditCardNumber = value; } } ///... }
Или же, если вам нужна возможность гибкой настройки этих правил, скажем, для согласования с констрейнтами в базе данных, то правила можно определить в файле конфигурации:
<nhv-mapping xmlns="urn:nhibernate-validator-1.0"> <class name="NHibernate.Validator.Demo.Winforms.Model.Customer, NHibernate.Validator.Demo.Winforms"> <property name="FirstName"> <not-empty/> <not-null/> </property> <property name="Email"> <email/> </property> <property name="Zip"> <pattern regex="^[A-Z0-9-]+$" message="Examples of valid matches: 234G-34DA | 3432-DF23"/> <pattern regex="^....-....$" message="Must match ....-...."/> </property> </class> </nhv-mapping>
Ну и пример того, как происходит процесс валидации:
Для начала создаем экземпляр валидатора:
NHVConfiguration nhvc = new NHVConfiguration(); nhvc.Properties[Environment.ApplyToDDL] = "false"; nhvc.Properties[Environment.AutoregisterListeners] = "true"; nhvc.Properties[Environment.ValidatorMode] = "UseAttribute"; nhvc.Mappings.Add(new MappingConfiguration("NHibernate.ValidatorDemo.Model", null)); ValidatorEngine validator = new ValidatorEngine(); validator.Configure(nhvc);
Ну и потом пользуемся им:
public void Create([DataBind("user")] User user) { InvalidValue[] errors = validator.Validate(user); if (errors.Length > 0) { Flash["errors"] = errors; RedirectToAction("index"); } else { repository.Create(user); } }
Процесс валидации можно попробовать сделать более прозрачным, например, используя фильтры в ASP.NET MVC, или реализовав какие-то аспекты прямо на уровне модели домена.
P.S. Пост написан мо мотивам этого поста.
Опубликовать | Tweet |
Комментариев нет:
Отправить комментарий