Проблема со статическим методом в ASP.NET - PullRequest
2 голосов
/ 16 мая 2011

У меня проблема со статическим методом в ASP.NET. Я создал синглтон ниже. В процессе выполнения я буду вызывать Context.getInstance () несколько раз, и мне нужно одно и то же значение контекста. Но как только я делаю другой запрос (Get, Post, где угодно) к серверу, мне нужен новый контекст, потому что мой контекст зависит от .NET HttpContext. Но, к сожалению, как только я в первый раз вызываю getInstance, класс больше никогда не будет создан.

Есть идеи, как решить эту проблему?

public class Context
{
   private static Context _context = null;

   private Context()
   { ... }

   public static Context getInstance()
   {
       if (Context._context == null)
           _context = new Context();

       return _context;
   }
}

Ответы [ 4 ]

4 голосов
/ 16 мая 2011

Избавьтесь от вашей статической переменной и сохраните ее в HttpContext.Current.Items.

public static Context GetInstance()
{
    if (HttpContext.Current.Items["MyContext"] == null) 
    {
        HttpContext.Current.Items["MyContext"] = new Context();
    }
    return (Context)HttpContext.Current.Items["MyContext"];
}
0 голосов
/ 16 мая 2011

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

0 голосов
/ 16 мая 2011

Другой подход - я предпочитаю использовать свои собственные переменные ThreadStatic (ala HttpContext.Current), а не использовать коллекции HttpContext Items просто потому, что я думаю (мнение), что это делает для более чистого кода. YMMV.

public class Context
{
    [ThreadStatic()]
    private static Context _Context = null;

    private HttpContext _HttpContext = null;

    public Context()
    {
        _HttpContext = HttpContext.Current;
    }

    public static Context Current
    {
        if(_Context == null || 
           _HttpContext != _HttpContext.Current)
        {
            _Context = new Context();
        }
        return _Context;
    }
}
0 голосов
/ 16 мая 2011

Если я вас правильно понимаю, вам нужен контекст только в одностраничном запросе, верно?Если это так, то описанный выше метод, безусловно, не сработает - статика будет жить всю жизнь домена приложения.Это время жизни может варьироваться в зависимости от ряда факторов.Я хотел бы начать с создания базового класса страницы (унаследованного от основного класса страниц ASP.NET) и включить в него свойство Context.Поскольку страница «живет» только для одного запроса, это должно работать для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...