C# - ResourceManager - кешируем или как?
Нигде особо это не обсуждается. В МСДНе тоже глухо по этой теме. Лишь на 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; } } }