【问题标题】:EntLib Validation: Localization without resources - Validation from configurationEntLib 验证:没有资源的本地化 - 从配置验证
【发布时间】:2011-01-11 22:16:45
【问题描述】:

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

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

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

,但上面的 'val' 是 GenericValidatorWrapper 类型,并且没有访问“真正的验证器”实例的属性。

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

有什么建议吗?

企业库版本为 5。

【问题讨论】:

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


    【解决方案1】:

    您也许可以使用反射来修改您感兴趣的验证器属性。但这确实很混乱和 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,但更独特)。

    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).

    【讨论】:

    • 谢谢。我也考虑过消息(或标签)的用法,但是您不能在本地化消息中使用模板功能(不能使用占位符)。
    • 我在这里得到了答案:entlib.codeplex.com/Thread/View.aspx?ThreadId=241350。 (这样我可以使用对我来说很关键的模板文本。)
    • 这和我的想法一样!除了我正在生成配置文件以避免配置重复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多