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