C# nHibernate验证器自定义IMessageInterpolator

C# nHibernate验证器自定义IMessageInterpolator,c#,nhibernate,validation,C#,Nhibernate,Validation,有人设法让自定义IMessageInterpolator工作到 启用错误消息的自定义。我已经试着跟着这条路走了 此网页上的说明无效。 查看代码,DefaultMessageInterpolator看起来很漂亮 烘焙到框架中,所以我缺少了什么 我已经包括了我的单元测试来展示我是如何实现它的 namespace TestValidator { [TestClass] public class UnitTest1 { [TestMethod]

有人设法让自定义IMessageInterpolator工作到 启用错误消息的自定义。我已经试着跟着这条路走了 此网页上的说明无效。

查看代码,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";
        }
    }
}

我看过你的问题,最有趣的是:

Assert.AreEqual(typeof(CustomMessageInterpolator), ve.Interpolator.GetType());
这是真的。我假设问题在于CFG已经配置了DefaultMessageInterpolator,并且

ve.Configure(nhvc);

没有效果,因为ClassValidator使用默认MessageInterpolator这个配置的nomatter。这就是为什么对于Climens,它在App.config中工作,而不是在nhvalidator.cfg.xml中工作的原因。

我查看了您的问题,最有趣的是:

Assert.AreEqual(typeof(CustomMessageInterpolator), ve.Interpolator.GetType());
这是真的。我假设问题在于CFG已经配置了DefaultMessageInterpolator,并且

ve.Configure(nhvc);

没有效果,因为ClassValidator使用默认MessageInterpolator这个配置的nomatter。这就是为什么对于Climens,它在App.config中工作,而不是在nhvalidator.cfg.xml中工作的原因。

我终于让它工作了。在调用存储库中的验证器之前,我显式地创建并将插值器作为参数传递

ClassValidator classValidator = new ClassValidator(obj.GetType(), null, new CustomMessageInterpolator(), 
CultureInfo.CurrentCulture, ValidatorMode.UseAttribute);
InvalidValue[] validationMessages = classValidator.GetInvalidValues(obj);

我终于有办法了。在调用存储库中的验证器之前,我显式地创建并将插值器作为参数传递

ClassValidator classValidator = new ClassValidator(obj.GetType(), null, new CustomMessageInterpolator(), 
CultureInfo.CurrentCulture, ValidatorMode.UseAttribute);
InvalidValue[] validationMessages = classValidator.GetInvalidValues(obj);

我正在使用fluent Nhibernate注册Nhibernate验证器,消息插值器已正确集成。要记住的关键是,共享引擎提供程序提供了对验证器引擎的单例访问。如果您尝试在应用程序中实例化一个新的验证器引擎,它将不会配置消息插入器,因为配置它的唯一方法是在初始化期间,如下所示

        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);
Environment.SharedEngineProvider=新的NHibernateSharedEngineProvider();
var fluentConfiguration=新fluentConfiguration();
fluentConfiguration
.SetMessageInterpolator()
.SetDefaultValidatorMode(ValidatorMode.OverrideAttributeWithExternal)
.与纤维酸盐整合
.applyingddl约束条件()
.及
.RegisteringListeners();
var validatorEngine=Environment.SharedEngineProvider.GetEngine();
validatorEngine.Configure(fluentConfiguration);
初始化(验证引擎);

我正在使用fluent Nhibernate注册Nhibernate验证器,消息插入器已正确集成。要记住的关键是,共享引擎提供程序提供了对验证器引擎的单例访问。如果您尝试在应用程序中实例化一个新的验证器引擎,它将不会配置消息插入器,因为配置它的唯一方法是在初始化期间,如下所示

        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);
Environment.SharedEngineProvider=新的NHibernateSharedEngineProvider();
var fluentConfiguration=新fluentConfiguration();
fluentConfiguration
.SetMessageInterpolator()
.SetDefaultValidatorMode(ValidatorMode.OverrideAttributeWithExternal)
.与纤维酸盐整合
.applyingddl约束条件()
.及
.RegisteringListeners();
var validatorEngine=Environment.SharedEngineProvider.GetEngine();
validatorEngine.Configure(fluentConfiguration);
初始化(验证引擎);

如果需要验证器在运行时检查实体,而不是创建验证器的新实例,则可以从配置NHV时注册的引擎请求验证器

var engine = NHibernate.Validator.Cfg.Environment.SharedEngineProvider.GetEngine();
return engine.GetClassValidator(YourEntityType);

如果需要验证器在运行时检查实体,而不是创建验证器的新实例,则可以从配置NHV时注册的引擎请求验证器

var engine = NHibernate.Validator.Cfg.Environment.SharedEngineProvider.GetEngine();
return engine.GetClassValidator(YourEntityType);

您可以添加您的NHibernate和NHibernate。验证程序也可以配置吗?这是完整的配置。没有了。请添加您的NHibernate和NHibernate。验证程序也配置了吗?这是完整的配置。没有了。