Фон / Вопрос:
Я довольно плохо знаком с шаблоном дизайна синглтона. Я однажды использовал его в веб-приложении (с помощью SO-сообщества):
public static AppGlobal Instance
{
get
{
if (HttpContext.Current.Session != null)
{
HttpSessionState session = HttpContext.Current.Session;
if (session["AppGlobalInstance"] == null)
{
session["AppGlobalInstance"] = new AppGlobal();
}
return (AppGlobal)session["AppGlobalInstance"];
}
else
{
return null;
}
}
}
Приведенная выше реализация имеет смысл для меня, поскольку экземпляр AppGlobal
хранится в сеансе. Когда сеанс умирает, AppGlobal
умирает. Что произойдет, если я использую тот же шаблон проектирования в библиотеке классов , который вызывается веб-приложением ? Например, пользователи запрашивают страницу, которая вызывает методы в DLL, которая не знает о сеансе. Будут ли сохранены данные, хранящиеся в одноэлементном экземпляре, через несколько вызовов?
private static readonly Singleton instance = new Singleton();
private Singleton() { }
public static Singleton Instance
{
get
{
return instance;
}
}
Дополнительная информация:
Вот что я пытаюсь выполнить: у меня есть веб-приложение, которое будет получать запросы XML от стороннего приложения. Этот XML скажет моему веб-приложению выполнить одну из трех вещей (или все три). Я хотел бы иметь одноэлементный экземпляр класса, который хранит данные, к которым могут обращаться несколько классов. Я хочу, чтобы экземпляр синглтона DIE после каждого запроса. Если вышесказанное не позволяет этого сделать, как лучше всего это сделать?
Примечание. Это веб-приложение запускается на одном сервере и никогда не запускается на ферме.
РЕДАКТИРОВАТЬ 1:
Основываясь на предложении ниже, я использовал System.Web.HttpContext.Current.Session
для хранения своего экземпляра класса. Похоже ли это на правильный подход для синглтона, который будет уникальным для каждого сеанса (помните, я в библиотеке классов)?
public static Ariba Instance
{
get
{
if (HttpContext.Current.Session != null)
{
HttpSessionState session = HttpContext.Current.Session;
if (session["AribaInstance"] == null)
{
session["AribaInstance"] = new Ariba();
}
return (Ariba)session["AribaInstance"];
}
else
{
return null;
}
}
}