У меня есть несколько веб-служб ASP.NET, которые имеют общий вспомогательный класс, им нужно только создать экземпляр на сервер. Он используется для простого перевода данных, но при запуске тратит некоторое время на загрузку вещей из файла web.config и т. д. Вспомогательный класс на 100% потокобезопасен. Думайте об этом как о простой библиотеке вызовов служебных программ. Я бы сделал все методы, общие для класса, но я хочу загрузить начальную конфигурацию из web.config. Мы развернули веб-службы в IIS 6.0 и использовали пул приложений с веб-садом 15 рабочих.
Я объявил вспомогательный класс как частную общую переменную в Global.asax и добавил свойство Shared ReadOnly для отложенной загрузки следующим образом:
Private Shared _helper As MyHelperClass
Public Shared ReadOnly Property Helper() As MyHelperClass
Get
If _helper Is Nothing Then
_helper = New MyHelperClass()
End If
Return _helper
End Get
End Property
У меня есть код регистрации в конструкторе для MyHelperClass(), и он показывает, что конструктор работает для каждого запроса, даже в том же потоке. Я уверен, что мне просто не хватает некоторых ключевых деталей ASP.NET, но MSDN не очень помог.
Я пробовал делать аналогичные вещи, используя как Application("Helper"), так и Cache("Helper"), и я все еще видел, как конструктор запускается с каждым запросом.





Раньше я делал что-то подобное в собственном приложении, и это вызывало разные странные ошибки. Каждый пользователь будет иметь доступ ко всем остальным данным в собственности. Кроме того, вы можете столкнуться с тем, что один пользователь будет использовать его, а затем отключиться, потому что его запросил другой пользователь.
Никакого там не изолированного.
Вы можете поместить своего помощника в состояние приложения. Сделайте это в global.asax:
void Application_Start(object sender, EventArgs e)
{
Application.Add("MyHelper", new MyHelperClass());
}
Вы можете использовать Помощник таким образом:
MyHelperClass helper = (MyHelperClass)HttpContext.Current.Application["MyHelper"];
helper.Foo();
В результате получается единственный экземпляр класса MyHelperClass, который создается при запуске приложения и находится в состоянии приложения. Поскольку экземпляр создается в Application_Start, это происходит только один раз для каждого экземпляра HttpApplication, а не для каждого запроса.
Майкл - Я не думаю, что это будет создавать экземпляр нового объекта при каждом запросе. Объект создается при запуске приложения, всего один раз. Вторая часть просто присваивает объектной переменной, указывающей на существующий объект. За все время существует только 1 экземпляр объекта.
ингридиент_15939 абсолютно прав. Один объект на приложение, а не один на запрос. Новый создается при каждом перезапуске приложения (например, после перезагрузки iisreset или сервера ...)
Нецелесообразно использовать состояние приложения, если оно вам не требуется, все будет намного проще, если вы будете использовать объекты для каждого запроса. Любое добавление состояния к вспомогательным классам могло вызвать всевозможные незаметные ошибки. Используйте коллекцию элементов HttpContext.Current и инициализируйте ее для каждого запроса. Модуль VB будет делать то, что вы хотите, но вы не должны делать его с отслеживанием состояния.
Очень-очень плохая идея для дорогих объектов воссоздавать их для каждого запроса. Работает, если у вас сайт с низким трафиком, но убивает вас при большой нагрузке на сервер.
Это создавало бы новый объект для каждого отдельного запроса - я думаю, Боб пытается получить единственный объект на сервер.