Пользовательский IMessageInterpolator nHibernate Validator - PullRequest
1 голос
/ 25 мая 2009

Кому-нибудь удалось получить собственный IMessageInterpolator, работающий с включить настройку сообщений об ошибках. Я пытался следовать инструкции на этой веб-странице, но безрезультатно. http://codelog.climens.net/2009/03/04/nhibernate-validator-custom-messages/

Глядя на код, DefaultMessageInterpolator выглядит довольно запеченный в каркасе, так что есть что-то, что мне не хватает.

Я включил свои модульные тесты, чтобы показать, как я их реализую.

namespace TestValidator
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestValidator()
        {
            var customer = new Customer();

            ClassValidator classValidator = new ClassValidator(customer.GetType());
            InvalidValue[] validationMessages = classValidator.GetInvalidValues(customer);

            Assert.IsTrue(validationMessages.Length == 1);
            Assert.IsTrue(validationMessages[0].Message == "may not be null or empty");
        }

        [TestMethod]
        public void TestCustomInterpolator()
        {
            ValidatorEngine ve = new ValidatorEngine();
            NHVConfiguration nhvc = new NHVConfiguration();
            nhvc.Properties[Environment.MessageInterpolatorClass] = typeof(CustomMessageInterpolator).AssemblyQualifiedName;
            ve.Configure(nhvc);

            var customer = new Customer();

            ClassValidator classValidator = new ClassValidator(customer.GetType());
            InvalidValue[] validationMessages = classValidator.GetInvalidValues(customer);

            Assert.IsTrue(validationMessages.Length == 1);
            // THIS TEST FAILS!!
            Assert.IsTrue(validationMessages[0].Message == "CustomMessageInterpolator");
        }
    }

    public class Customer
    {
        public virtual int CustomerId { get; set; }

        [NotNullNotEmpty]
        public string CustomerName { get; set; }
    }

    public class CustomMessageInterpolator : IMessageInterpolator
    {
        public CustomMessageInterpolator()
        {

        }

        public string Interpolate(string message, IValidator validator, IMessageInterpolator defaultInterpolator)
        {
            return "CustomMessageInterpolator";
        }
    }
}

Ответы [ 4 ]

1 голос
/ 12 октября 2009

У меня наконец-то получилось. Перед вызовом валидатора в моем хранилище я явно создаю и передаю Интерполятор в качестве параметра.

ClassValidator classValidator = new ClassValidator(obj.GetType(), null, new CustomMessageInterpolator(), 
CultureInfo.CurrentCulture, ValidatorMode.UseAttribute);
InvalidValue[] validationMessages = classValidator.GetInvalidValues(obj);
0 голосов
/ 25 августа 2013

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

var engine = NHibernate.Validator.Cfg.Environment.SharedEngineProvider.GetEngine();
return engine.GetClassValidator(YourEntityType);
0 голосов
/ 08 июня 2012

Я использую свободный Nhibernate для регистрации валидатора NHibernate, и интерполятор сообщений интегрирован правильно. Необходимо помнить, что поставщик Shared Engine предоставляет Singleton-доступ к модулю Validator. Если вы попытаетесь создать в своем приложении новый механизм проверки, в нем не будет настроен интерполятор сообщений, поскольку единственный способ настроить его - это во время инициализации, как показано ниже.

        Environment.SharedEngineProvider = new NHibernateSharedEngineProvider();

        var fluentConfiguration = new FluentConfiguration();

        fluentConfiguration
            .SetMessageInterpolator<CustomMessageInterpolator>()
            .SetDefaultValidatorMode(ValidatorMode.OverrideAttributeWithExternal)
            .IntegrateWithNHibernate
            .ApplyingDDLConstraints()
            .And
            .RegisteringListeners();

        var validatorEngine = Environment.SharedEngineProvider.GetEngine();
        validatorEngine.Configure(fluentConfiguration);
        configuration.Initialize(validatorEngine);
0 голосов
/ 05 июня 2009

Я посмотрел на вашу проблему, и самое интересное, что:

Assert.AreEqual(typeof(CustomMessageInterpolator), ve.Interpolator.GetType());

верно. Я предполагаю, что проблема в том, что CFG уже был настроен с DefaultMessageInterpolator, а

ve.Configure(nhvc);

не имеет эффекта, потому что ClassValidator использует nomatter этой конфигурации DefaultMessageInterpolator. Это причина того, почему для Climens он работал в App.config, а не в nhvalidator.cfg.xml.

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