EntLib验证:没有资源的本地化 - 从配置验证

时间:2011-01-11 22:16:45

标签: c# enterprise-library enterprise-library-5

我想使用自己的本地化实现,而不是框架提供的默认资源文件系统。我还需要在配置文件中配置验证器。

我的问题是我在实例化ConfigurationValidatorFactory后不知道如何访问Validator对象来更改其消息模板。我可以像这样为我的对象创建一个验证器:

var cfgSrc = new FileConfigurationSource("Validations.xml");
var factory = ConfigurationValidatorFactory.FromConfigurationSource(cfgSrc);
Validator val = factory.CreateValidator<MyObj>();

,但上面的'val'是GenericValidatorWrapper类型,没有属性可以访问'true validator'实例。

验证后,我可以看到真正的Validator实例,但是更改模板文本为时已晚。然后,已经创建了最终消息(包含限制值),更改模板将不会重新创建消息。

有什么建议吗?

企业库版本为5。

1 个答案:

答案 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));
}

<强>更新

好的,如果您需要模板文本,您可以通过反射调查,但仍然看起来非常混乱。

根据您的要求(配置文件,维护模板),我可能会做的是创建多个配置文件,每个配置文件都包含您想要的模板文本。

这是一个维护噩梦所以我会把这个想法改进为:

  1. 创建我的配置文件Validations.xml,而不是将我的模板化文本放入其中,我会为每条消息使用一个唯一的占位符(例如NAME_INVALID_LENGTH,但更独特的是ish)。

  2. 然后我会编写一小段代码/工具,对于您支持的每个语言环境,将使用特定于语言环境的模板化文本替换唯一占位符。并将生成的文件复制到OutDir下的特定于语言环境的文件夹(例如bin \ debug \ en-US \ Validations.xml)。这类似于.NET部署附属程序集的方式,因此它不是那么容易。

  3. 运行上面的工具作为构建后步骤。该工具可以标记它找不到的占位符,以便在构建期间报告它。这应该有助于保持占位符和模板文本同步。

  4. 修改代码以使用特定于语言环境的配置文件:

    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)

相关问题