2009-05-25 85 views
1

有没有人设法让自定义IMessageInterpolator工作到 启用错误消息的自定义。我试过在此网页上按照 指示操作,但无济于事。 http://codelog.climens.net/2009/03/04/nhibernate-validator-custom-messages/nHibernate验证器自定义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"; 
     } 
    } 
} 
+0

你可以添加你的NHibernate和NHibernate.Validator配置吗? – zihotki 2009-06-03 23:03:22

回答

1

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

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

我看过了你的问题,而最有意思的是:

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

是真实的。我认为这个问题是这样一个事实:CFG已经与DefaultMessageInterpolator配置,并且

ve.Configure(nhvc); 

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

0

我使用功能NHibernate注册NHibernate的验证器和消息内插器正确地整合。要记住的关键是共享引擎提供程序提供对Validator引擎的Singleton访问。如果您尝试在您的应用程序中实例化新的验证器引擎,它将不会将消息插值器配置为在初始化期间配置它的唯一方法,如下所示。

 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

如果您需要验证在运行时检查,而不是创建一个校验器的新实例的实体,您可以要求在配置NHV注册时发动机的验证。

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