Как сохранить экземпляр класса (вспомогательный класс) в ASP.NET Cache? - PullRequest
0 голосов
/ 30 июня 2010

У меня есть экземпляр класса, который создается с помощью метода Activator.CreateInstance().Этот экземпляр класса содержит вспомогательные методы, которые часто используются в приложении.Чтобы избежать создания экземпляра несколько раз, я просто думаю о реализации соответствующего механизма кэширования.

Необходимо учитывать следующее соображение:

1) Я не могу использоватьстатический класс и методы.

2) Для каждого домена приложения существует около 6 экземпляров (1 экземпляр на класс).

Ваше предложение будет высоко оценено!

Ответы [ 4 ]

2 голосов
/ 30 июня 2010

Если вы не хотите создавать его несколько раз, не используйте объект кэша ASP.Net. Объект кеша, в частности, не гарантирует, что все, что вы в него поместите, останется там. На самом деле, это одна из первых вещей, которую нужно уничтожить, если серверу нужно освободить ресурсы.

Лучшим вариантом было бы использование объекта HttpApplicationState , который должен использоваться для хранения объектов, которые должны быть глобально доступны для всех сеансов. Он также имеет встроенную безопасность потоков, если вы обращаетесь к нему должным образом.

Код для этого следующий:

HttpContext.Current.Application.Lock();
HttpContext.Current.Application["myObject"] = myObject;
HttpContext.Current.Application.Unlock();

Используя это просто

var myObject = (MyObject)HttpContext.Current.Application["myObject"];
1 голос
/ 30 июня 2010

Использовать шаблон singleton :

class MySingleton {

     private static MySingleton instance;

     public MySingleton {
          if(instance != null)
              // One already created, the only call to this
              // should come through Activator
              throw...
          instance = this;
     }

     public static MySingleton GetInstance() {
          if(instance == null) instance = new MySingleton();
          return instance;
     }

}

Активатор использует открытый конструктор.Тогда вы все равно можете получить экземпляр через GetInstance().

0 голосов
/ 30 июня 2010

Звучит как случай для контейнера ввода зависимостей.Независимо от того, какой из них вы выберете, все они поддерживают кэширование, как синглтон, и он сделает для вас часть Activator.CreateInstance.

0 голосов
/ 30 июня 2010

Объявление 1) Как насчет статического контейнера для вашего экземпляра?Вдоль линий синглтон-паттерна?

Ad 2) 6 синглетонов или один статический универсальный синглтон-класс.

PS: Полагаю, статическое ограничение предназначено только для самого вспомогательного класса?*

PPS: использование HttpContext.Current.Application было бы почти таким же подходом, за исключением медленного.

...