(Commerce Server) Как получить PageGroup[] без создания нового объекта MarketingContext
Если вы посмотрите на блог Тома Шульца, вы увидите, что он говорит, что если вы создаете экземпляр своих собственных объектов Context (таких как объект CommerceContext), то экземпляр класса SiteConfigReadOnlyFreeThreaded также создается в памяти, и вы не можете сделать что-нибудь, чтобы уничтожить это. Если вы делаете это достаточно много раз, вы в конечном итоге получите предупреждения в журнале приложений. Вот как выглядит предупреждение:
Среда выполнения Commerce Server обнаружила, что было создано более # экземпляров объекта SiteConfigReadOnlyFreeThreaded. Создание многих экземпляров SiteConfigReadOnlyFreeThreaded негативно повлияет на производительность сайта. Пожалуйста, обратитесь к документации Commerce Server для рекомендуемого использования объекта SiteConfigReadOnlyFreeThreaded.
Вы также увидите, что Том говорит использовать свойство Current объектов Context, чтобы избежать этой ошибки, примерно так:
ContentSelector cso = CommerceContext.Current.TargetingSystem.SelectionContexts["advertising"].GetSelector();
При этом повторно используется один и тот же экземпляр-одиночка, чтобы избежать повторного создания объекта SiteConfigReadOnlyFreeThreaded каждый раз, когда вы создаете экземпляр нового класса CommerceContext.
Со мной так далеко? Хорошо:)
Вот что я на самом деле пытаюсь сделать: получить список всех групп страниц, настроенных в разделе "Маркетинг" Commerce Server. Насколько мне известно, вот единственный способ сделать это:
using (MarketingContext ctx = MarketingContext.Create("MyCommerceSite", "MyMarketingAuthorizationStore", AuthorizationMode.NoAuthorization))
{
PageGroup[] pageGroups = ctx.PageGroups.GetAllPageGroups();
}
Как вы можете видеть, я создаю класс MarketingContext, который также создает SiteConfigReadOnlyFreeThreaded в памяти также каждый раз, когда он вызывается (что случается часто).
Есть ли способ получить список всех настроенных групп страниц без создания экземпляра совершенно нового объекта MarketingContext каждый раз, когда я хочу это сделать?
1 ответ
Я немного покопался и обнаружил следующее:
По умолчанию Microsoft устанавливает пороговое значение для этих предупреждений, даже появляющихся в журнале ошибок, равным 100. Получается, что эти предупреждения абсолютно безобидны, если их количество постоянно меньше 100.
В моем случае я установил порог для отображения ошибок равным 2, просто чтобы показать каждый экземпляр, который возник, независимо от того, была ли это действительная проблема или нет. Я поднял предел до 100, и пока я не видел никаких негативных последствий.