2009-05-25 11 views
1

誰でも、エラーメッセージのカスタマイズを可能にするカスタムIMessageInterpolatorを にすることができました。このウェブページの 手順に従ってみましたが、役に立たないです。 http://codelog.climens.net/2009/03/04/nhibernate-validator-custom-messages/nHibernate Validatorカスタム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

+0

これは完全な設定です。もうない。 – Craig

答えて

1

私はこれが最終的に動作するようにしています。リポジトリでバリデーターを呼び出す前に、インターポレーターを明示的に作成し、パラメーターとして渡します。

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で設定されたという事実であると仮定し、そしてClassValidatorこの設定DefaultMessageInterpolatorのnomatterを使用しているため

ve.Configure(nhvc); 

は、効果はありません。これがClimensにとって、なぜnhvalidator.cfg.xmlではなくApp.configで機能するのかが原因です。

0

私は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); 
0

は、あなたがNHVを設定するときに、登録エンジンからバリデータを要求することができます。

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