NHibernate Validator: использование атрибутов и использование ValidationDefs - PullRequest
2 голосов
/ 16 марта 2011

Я уже некоторое время использую NH Validator, в основном через ValidationDef с, но я все еще не уверен насчет двух вещей:

  1. Есть ли какое-то особое преимущество использования ValidationDef для простых / стандартных проверок (например, NotNull, MaxLength и т. д.)?
  2. Меня беспокоит тот факт, что эти два метода генерируют различные виды исключений при проверке, например:
    • ValidationDef Define.NotNullable() throws PropertyValueException
    • При использовании атрибута [NotNull], InvalidStateException выбрасывается.

Thisзаставляет меня думать, что смешивание этих двух подходов не очень хорошая идея - будет очень сложно последовательно обрабатывать исключения из проверки.Любые предложения / рекомендации?

1 Ответ

3 голосов
/ 17 марта 2011

ValidationDef , вероятно, больше подходит для проверки бизнес-правил , даже если, сказав это, я использовал ее даже для простой проверки. Здесь больше здесь .
Что мне нравится в ValidationDef , так это то, что он имеет свободный интерфейс. Я уже давно играю с этим движком, и я собрал кое-что, что хорошо работает для меня.
Я определил интерфейс:

public interface IValidationEngine
{
    bool IsValid(Entity entity);
    IList<Validation.IBrokenRule> Validate(Entity entity);
}

Что реализовано в моем механизме проверки:

public class ValidationEngine : Validation.IValidationEngine
{
    private NHibernate.Validator.Engine.ValidatorEngine _Validator;

    public ValidationEngine()
    {
        var vtor = new NHibernate.Validator.Engine.ValidatorEngine();
        var configuration = new FluentConfiguration();
        configuration
            .SetDefaultValidatorMode(ValidatorMode.UseExternal)
            .Register<Data.NH.Validation.User, Domain.User>()
            .Register<Data.NH.Validation.Company, Domain.Company>()
            .Register<Data.NH.Validation.PlanType, Domain.PlanType>();
        vtor.Configure(configuration);
        this._Validator = vtor;
    }

    public bool IsValid(DomainModel.Entity entity)
    {
        return (this._Validator.IsValid(entity));
    }

    public IList<Validation.IBrokenRule> Validate(DomainModel.Entity entity)
    {
        var Values = new List<Validation.IBrokenRule>();
        NHibernate.Validator.Engine.InvalidValue[] values = this._Validator.Validate(entity);
        if (values.Length > 0)
        {
            foreach (var value in values)
            {
                Values.Add(
                    new Validation.BrokenRule()
                    {
                        // Entity = value.Entity as BpReminders.Data.DomainModel.Entity,
                        // EntityType = value.EntityType,
                        EntityTypeName = value.EntityType.Name,
                        Message = value.Message,
                        PropertyName = value.PropertyName,
                        PropertyPath = value.PropertyPath,
                        // RootEntity = value.RootEntity as DomainModel.Entity,
                        Value = value.Value
                    });
            }
        }
        return (Values);
    }
}

Я включаю туда все свои доменные правила.
Я запускаю движок при запуске приложения:

For<Validation.IValidationEngine>()
    .Singleton()
    .Use<Validation.ValidationEngine>();

Теперь, когда мне нужно проверить свои сущности перед сохранением, я просто использую движок:

if (!this._ValidationEngine.IsValid(User))
{
    BrokenRules = this._ValidationEngine.Validate(User);
}

и вернуть, в конце концов, набор нарушенных правил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...