我想使用自己的本地化实现,而不是框架提供的默认资源文件系统。我还需要在配置文件中配置验证器。
我的问题是我在实例化ConfigurationValidatorFactory后不知道如何访问Validator对象来更改其消息模板。我可以像这样为我的对象创建一个验证器:
var cfgSrc = new FileConfigurationSource("Validations.xml");
var factory = ConfigurationValidatorFactory.FromConfigurationSource(cfgSrc);
Validator val = factory.CreateValidator<MyObj>();
,但上面的'val'是GenericValidatorWrapper类型,没有属性可以访问'true validator'实例。
验证后,我可以看到真正的Validator实例,但是更改模板文本为时已晚。然后,已经创建了最终消息(包含限制值),更改模板将不会重新创建消息。
有什么建议吗?
企业库版本为5。
答案 0 :(得分:0)
您或许可以使用反射来修改您感兴趣的验证器属性。但这确实很混乱和Kludgy。
如果您只是在验证后更换了验证结果上的消息文本,该怎么办?
配置文件中的消息可以是占位符(例如NAME_INVALID_LENGTH),您可以将其替换为实际文本。
var cfgSrc = new FileConfigurationSource("Validations.xml");
var factory = ConfigurationValidatorFactory.FromConfigurationSource(cfgSrc);
Validator val = factory.CreateValidator<MyObj>();
MyObj myObj = new MyObj();
myObj.Name = "Swiper McFoxy";
ValidationResults results = new ValidationResults();
foreach (ValidationResult result in val.Validate(myObj))
{
results.AddResult(
new ValidationResult(
GetMessage<MyObj>(result.Message, new CultureInfo("en")),
result.Target,
result.Key,
result.Tag,
result.Validator,
result.NestedValidationResults));
}
<强>更新强>
好的,如果您需要模板文本,您可以通过反射调查,但仍然看起来非常混乱。
根据您的要求(配置文件,维护模板),我可能会做的是创建多个配置文件,每个配置文件都包含您想要的模板文本。
这是一个维护噩梦所以我会把这个想法改进为:
创建我的配置文件Validations.xml
,而不是将我的模板化文本放入其中,我会为每条消息使用一个唯一的占位符(例如NAME_INVALID_LENGTH,但更独特的是ish)。
然后我会编写一小段代码/工具,对于您支持的每个语言环境,将使用特定于语言环境的模板化文本替换唯一占位符。并将生成的文件复制到OutDir下的特定于语言环境的文件夹(例如bin \ debug \ en-US \ Validations.xml)。这类似于.NET部署附属程序集的方式,因此它不是那么容易。
运行上面的工具作为构建后步骤。该工具可以标记它找不到的占位符,以便在构建期间报告它。这应该有助于保持占位符和模板文本同步。
修改代码以使用特定于语言环境的配置文件:
CultureInfo culture = new CultureInfo("en-us");
var cfgSrc = new FileConfigurationSource(culture.Name + @"\Validations.xml");
var factory = ConfigurationValidatorFactory.FromConfigurationSource(cfgSrc);
Validator val = factory.CreateValidator<MyObj>();
您可以在辅助方法后面抽象特定于文化的代码,以便更容易阅读和维护。例如GetValidationConfigurationSource(culture)
。