Область действия статического внутреннего класса в ASP.NET - PullRequest
0 голосов
/ 21 марта 2009

Я не уверен в области действия одного статического внутреннего класса нестатического класса.

В следующих строках будет ли переменная DataContextCreator.Instance (часть шаблона Singleton) указывать на один и тот же экземпляр PDataContext для всех объектов Page / запросов страницы или каждый объект будет иметь свой экземпляр?

public class Page : System.Web.UI.Page
{

    private class DataContextCreator
    {
        static DataContextCreator() { }

        public static readonly PDataContext Instance = new PDataContext(TUtil.GetConnectionString());
    }

    public PDataContext DataContext
    {
        get
        {
            return DataContextCreator.Instance;
        }
    }
}

Нужно ли работать с HttpContext.Current, чтобы это работало желаемым образом, т. Е. Нет общего DataContext? Если так, есть ли другой способ?

Я не уверен, что изменение статического класса на приватный (как я это сделал) помогает.

Спасибо!

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

    private PDataContext _DataContext;
    private PDataContext DataContext
    {
        get
        {
            if (this._DataContext == null)
            {
                this._DataContext = new PDataContext(TUtil.GetConnectionString());
            }
            return this._DataContext;
        }
    }

Ответы [ 3 ]

2 голосов
/ 21 марта 2009

Это было бы то же самое для каждой страницы. Статическая переменная является статической переменной, как бы она ни была вложенной. (Обобщения делают вещи «интересными» в том смысле, что статическая переменная в Foo<int> отделена от переменной в Foo<string> и т. Д., Но здесь это не имеет значения.)

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

1 голос
/ 21 марта 2009

Поскольку переменная Instance является статической, она существует только один раз, поэтому все потоки имеют одинаковое значение. Помещение переменной в другой класс не меняет принцип работы статической переменной.

Чтобы создать синглтон, локальный для экземпляра страницы, вы должны сохранить ссылку в контексте страницы:

public PDataContext DataContext {
   get {
      PDataContext result = HttpContext.Current["PData"];
      if (result == null) {
         result = new PDataContext(TUtil.GetConnectionString());
         HttpContext.Current["PData"] = result;
      }
      return result;
   }
}
1 голос
/ 21 марта 2009

Вложенные классы предназначены исключительно для удобства именования (и некоторые изменения модификаторов (частные и т. Д.)). На самом деле они такие же, как обычные (на высшем уровне) классы с точки зрения поведения. Таким образом, Instance полностью используется (не привязан к экземпляру страницы).

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