2011-01-11 57 views
1

我想使用自己的本地化實現,而不是框架提供的默認資源文件系統。我還需要在配置文件中配置驗證器。EntLib驗證:無資源本地化 - 從配置驗證

我的問題是,我不知道如何在實例化ConfigurationValidatorFactory後訪問Validator對象來更改它們的消息模板。我可以爲我的對象驗證這樣的:上面

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

,但「VAL」然後類型GenericValidatorWrapper並沒有屬性訪問「真正的驗證」的實例。

驗證之後,我可以看到真正的Validator實例,但是改變它們的模板文本爲時已晚。最終消息(包含限制值)已經創建完畢,更改模板不會重新創建消息。

有什麼建議嗎?

企業庫版本爲5

回答

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

更新

OK,如果你需要的模板文本你可以調查通過反射閒逛,但仍然看起來非常的混亂。

根據您的要求(配置文件,維護模板),我可能會做的是創建多個配置文件,每個配置文件都帶有您想要的模板文本。

這有點維護的噩夢,所以我會細化想法:

  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)

+0

謝謝。我也考慮過消息(或標籤)的用法,但是不能在本地化的消息中使用模板功能(不能使用佔位符)。 – friskm 2011-01-12 13:40:36