Deutsch

C# - ResourceManager - кешируем или как?

10.12.23 17:31
C# - ResourceManager - кешируем или как?
 
alex445 коренной житель
Последний раз изменено 10.12.23 18:17 (alex445)

Нигде особо это не обсуждается. В МСДНе тоже глухо по этой теме. Лишь на Stackoverflow один-два вопроса нашёл. Вроде сошлись, что надо кешировать, но импакт по производительности маленький. А я тут недавно засунул этот ResourceManager в самый базовый класс для всех классов - каждая сущность может иметь DisplayName и Description. И там значит при любом создании любого инстанса любой сущности создаётся этот ResourceManager и он ищет локализованные значения для DisplayName и Description. Только он всякий раз сам себя снова создаёт и грузит файлы ресурсов. И вот если я в цикле создал сотню объектов, у каждого из которых пару десятков полей, каждое из которых имеет DisplayName и Description, и инициализируется своим инстансом ResourceManager... Это ж сколько тысяч раз эти файлы ресурсов открылись и закрылись, не говоря уже о самом ResourceManager?..


По идее, его вообще синглетоном надо на всё приложение сделать, тем более, что он, как пишут в МСДНе, потокобезопасен. Т.е. даже если это сайт для многих пользователей, то лишь при старте сайта один раз создал его и всё. Но вот нигде не встречал описания сценария, когда ResourceManager организован как синглетон на всё время жизни приложения. Везде в примерах его создают и юзают по месту использования. И такое ощущение, что миллионы народу делают то же самое не задумываясь.


Что интересно, в генерящихся ресурсах, создающихся по шаблону resx файлов, уже есть свой закешированный ResourceManager (см. ниже) - для каждого типа Strings закеширован. И если кешировать самому ResourceManager, то Strings создаст свою закешированную копию.


public class Strings {
    private static global::System.Resources.ResourceManager resourceMan;
    ...
    /// <summary>
    ///   Returns the cached ResourceManager instance used by this class.
    /// </summary>    
    [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
    public static global::System.Resources.ResourceManager ResourceManager {
        get {
            if (object.ReferenceEquals(resourceMan, null)) {
                global::System.Resources.ResourceManager temp = 
                    new global::System.Resources.ResourceManager("...Strings", typeof(Strings).Assembly);
                resourceMan = temp;
            }
            return resourceMan;
        }
    }
}
 

Перейти на