nHibernate Validator自定义IMessageInterpolator

有没有人设法让自定义IMessageInterpolator工作以启用错误消息的自定义。 我试过按照这个网页上的说明但无济于事。 http://codelog.climens.net/2009/03/04/nhibernate-validator-custom-messages/

查看代码,DefaultMessageInterpolator似乎已经融入框架,所以我有什么遗漏。

我已经包含了我的unit testing,以显示我是如何实现它的。

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"; } } } 

我终于有了这个工作。 在我的存储库中调用validation器之前,我明确地创建并传递Interpolator作为参数。

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

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

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

是真的。 我假设问题在于CFG已经配置了DefaultMessageInterpolator,而且

 ve.Configure(nhvc); 

没有效果,因为ClassValidator使用此配置的默认值DefaultMessageInterpolator。 这就是Climens的原因,它在App.config中工作,而不是在nhvalidator.cfg.xml中。

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

  Environment.SharedEngineProvider = new NHibernateSharedEngineProvider(); var fluentConfiguration = new FluentConfiguration(); fluentConfiguration .SetMessageInterpolator() .SetDefaultValidatorMode(ValidatorMode.OverrideAttributeWithExternal) .IntegrateWithNHibernate .ApplyingDDLConstraints() .And .RegisteringListeners(); var validatorEngine = Environment.SharedEngineProvider.GetEngine(); validatorEngine.Configure(fluentConfiguration); configuration.Initialize(validatorEngine); 

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

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