2014-10-09 4 views
3

Я хочу добавить легко доступный вспомогательный класс к моему asp mvc. Я создал класс под названием Репозитории. Он имеет статическое свойство «Current», который выполняет следующие действия:Является ли эта одна из них круглыми ссылками?

public static readonly Repositories Current 
{ 
    get 
    { 
     if(HttpContext.Current.Items["Repositories"] == null) 
      HttpContext.Current.Items["Repositories"] = new Repositories(HttpContext.Current); 
     return (Repositories)HttpContext.Current.Items["Repositories"]; 
    } 
} 

Дело в том, что класс имеет статические вспомогательные функции, которые используют текущий экземпляр класса (привязан к текущей HttpContext). Вспомогательные функции выполняют всевозможные действия, поэтому я хотел организовать их таким образом, потому что он обеспечивает более красивый код в контроллерах, и у меня есть потенциальный доступ ко всем хранилищам баз данных (фактические объекты дескриптора создаются только при доступе в этот контекст, хотя).

В любом случае, как вы можете видеть, конструктор принимает в качестве аргумента значение HttpContext, которое затем хранится в поле частного класса, поэтому у меня было бы меньше типа. Это означает, что экземпляр класса Repositories ссылается на экземпляр класса HttpContext и наоборот. Когда значение HttpContext отбрасывается, означает ли это, что оно все еще хранится в памяти, сохраняясь круговой ссылкой с помощью экземпляра Repositories?

+1

Когда вы ожидаете, что HttpContext будет удален? –

+3

Помимо вашего вопроса, то, что вы здесь делаете, просто вводит переменные _global_. Я бы очень избегал такого дизайна, если бы я был вами: это приведет к непроверяемому коду. Вы должны вводить свои репозитории в свои контроллеры через конструктор, а не использовать HttpContext для их извлечения. –

+0

На самом деле это не глобально, хотя если для каждого запроса задан вспомогательный класс? Я пробовал делать всю инъекцию, но ее просто так неуклюжий, я не люблю. – user81993

ответ

2

Цифра «осиротевших» не заставляет объекты оставаться в памяти.

Если вы сделаете это:

class A 
{ 
    public B b; 

    ~A() 
    { 
     Console.WriteLine("COLLECTED A!"); 
    } 
} 

class B 
{ 
    public A a; 

    ~B() 
    { 
     Console.WriteLine("COLLECTED B!"); 
    } 
} 

и запустить этот код:

var a = new A(); 
var b = new B(); 

a.b = b; 
b.a = a; 

a = null; 
b = null; 

GC.Collect(); 

Оба экземпляр может (и будет) быть мусором. Вы получите что-то похожее на следующий результат:

COLLECTED B! 
COLLECTED A!