Замечательный проект затеял 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 |
Комментариев нет:
Отправить комментарий