Локализация ASP.NET: изменение ресурсов без перезапуска приложения? - PullRequest
6 голосов
/ 26 августа 2011

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

Обновление для уточнения сценария: Я говорю об изменении локализованных ресурсов во время выполнения.Допустим, у меня есть опечатка в немецком переводе страницы.Тогда какой-то администратор должен иметь возможность изменить эту опечатку во время выполнения.Не должно быть необходимости в повторном развертывании или перезапуске, чтобы это изменение было отражено в пользовательском интерфейсе.

Я использую ASP.NET MVC3.

Какие варианты у меня есть?

Я пытался написать пользовательский ResourceProvider , который загружает ресурсы из базы данных.Это кажется не слишком большим усилием, однако до сих пор я указал на два недостатка:

  • Он не работает с DataAnnotations, которые используются для удобной проверки в MVC3 (DataAnnotations работают с параметром ErrorMessageResourceType, который толькоработает с скомпилированными ресурсами)
  • Мы, в основном, должны предоставить собственный инструментарий для управления ресурсами (например, перевод и т. д.), что очень жаль, поскольку для этого есть много инструментов, которые работают с resx-файлами.1018 *

Какие есть другие варианты?Будет ли возможной манипуляция развернутыми resx-файлами во время выполнения?Но я подозреваю, что приложение автоматически перезапускается, когда обнаруживает эти изменения: я подозреваю, что ASP.NET понимает, что изменились resx-файлы, затем перезапускает пул приложений и компилирует новые resx-файлы на лету.Это правильно?Есть ли способ обойти это?

Я еще не рассматривал вопрос о компиляции ресурсов в спутниковые сборки до развертывания.Это даже рекомендуемый сценарий для веб-приложений?Но даже скомпилированные сателлитные сборки подозреваю, что ASP.NET перезапускает приложение, когда эти сборки меняются на лету.Это правильно?

Мне было бы интересно узнать, как можно удовлетворить первоначальные требования?И мне будут интересны любые комментарии по поводу вариантов, которые я упомянул выше.

1 Ответ

1 голос
/ 27 августа 2011

DataAnnotations принимают ErrorMessageResourceType, который сообщает ValidationAttrributes, где получить доступ к ресурсам. Вы можете передать это следующим образом:

[Required(
    ErrorMessageResourceType = typeof(DynamicResources), 
    ErrorMessageResourceName = "ResourceKey")]
public string Username { get; set; }

Создав тип для этого параметра со статическими свойствами для каждого ключа, вы можете создать реализацию, которая загружает ресурсы из базы данных или другой реализации. Затем вы можете объединить это с динамическим объектом для DRY и переместить реализацию в TryGetMember. Затем, возможно, используйте шаблоны T4 для генерации статики из вашей базы данных во время компиляции, что в итоге приведет к следующему:

public class DynamicResources : DynamicObject
{
    // move these into partial and generate using T4
    public static string MyResource
    {
        get { return Singleton.MyResource; }
    }

    public static string MyOtherResource
    {
        get { return Singleton.MyOtherResource; }
    }

    // base implementation to retrieve resources
    private static dynamic singleton;

    private static dynamic Singleton
    {
        get { return singleton ?? (singleton = new DynamicResources()); }
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        // some logic here to look up resources
        result = GetResourceKeyFromDatabase(binder.Name);
        return true;
    }
}

Конечно, было бы идеально, если бы ресурсы не были статическими свойствами.

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