2009-05-25 20 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);