Проверка EntLib: Локализация без ресурсов - Проверка из конфигурации - PullRequest
1 голос
/ 12 января 2011

Я хотел бы использовать мою собственную реализацию локализации вместо файловой системы ресурсов по умолчанию, которую предоставляет инфраструктура.Мне также нужно настроить валидаторы в файле конфигурации.

Моя проблема в том, что я не знаю, как получить доступ к объектам Validator, чтобы изменить их шаблоны сообщений после того, как я создал экземпляр ConfigurationValidatorFactory.Я могу создать валидатор для моего объекта, например так:

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

, но значение 'val' выше имеет тип GenericValidatorWrapper и не имеет свойств для доступа к экземплярам 'true validator'.

После проверки я вижу настоящие экземпляры Validator, но тогда уже слишком поздно менять их текст шаблона.Окончательное сообщение (содержащее предельные значения) уже создано, и изменение шаблона не приведет к повторному созданию сообщения.

Есть предложения?

Версия Enterprise Library равна 5.

1 Ответ

0 голосов
/ 12 января 2011

Вы можете использовать отражение, чтобы изменить интересующие вас свойства валидатора. Но это действительно грязно и запутанно.

Что если вы просто заменили текст сообщения в результатах проверки после проверки?

Сообщение в файле конфигурации может быть заполнителем (например, 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...