1

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

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

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

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

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

有什么建议么?

企业库版本为 5。

4

1 回答 1

0

您也许可以使用反射来修改您感兴趣的验证器属性。但这确实很混乱而且很混乱。

如果您只是在验证后替换验证结果上的消息文本怎么办?

配置文件中的消息可以是占位符(例如 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,但更独特)。

  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)

于 2011-01-12T02:28:19.500 回答