2009-03-21 3 views
0

Я не уверен в объеме одного статического внутреннего класса нестатического класса.Объем статического внутреннего класса в ASP.NET

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

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; 
     } 
    } 
+0

Если код на странице, нет никакой необходимости для блокировки. Поскольку свойство является локальным для страницы, к нему будет обращаться только один поток. – Guffa

ответ

2

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

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

+0

Спасибо. Я просто вижу, что было бы легко сделать это с помощью переменной экземпляра. Я пришел из одноэлементного рисунка. Но здесь этого не требуется. – user51710

+0

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

+0

Возможно, кто-то мог бы быстро взглянуть на мое решение в последнем редактировании и публикации, если с ним возникнут какие-либо проблемы. – user51710

1

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

1

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

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

public PDataContext DataContext { 
    get { 
     PDataContext result = HttpContext.Current["PData"]; 
     if (result == null) { 
     result = new PDataContext(TUtil.GetConnectionString()); 
     HttpContext.Current["PData"] = result; 
     } 
     return result; 
    } 
} 
Смежные вопросы