Хранение объекта контекста в объекте запроса, утилизируется ли он?

Я пишу приложение MVC3, используя NInject DI и шаблон репозитория. Ninject настроен так, что репозитории имеют время жизни для каждого запроса.

Я помещаю объект контекста в объект запроса Http, используя следующий код:

    public static MessengerEntities GetContext()
    {
        if (!HttpContext.Current.Items.Contains("_db_context"))
        {
            HttpContext.Current.Items.Add("_db_context", new MessengerEntities());
        }
        return (MessengerEntities)HttpContext.Current.Items["_db_context"];
    }

Затем каждый репозиторий вызывает эту процедуру, чтобы получить либо существующий, либо новый объект контекста, например:

public class TestRepository : ITestRepository
{
    private MessengerEntities context = ContextHelper.GetContext();

    #region ITestRepository Members
    private string _testProperty = "blah";
    public string testProperty
    {
        get
        {
            _testProperty = context.UserLogins.Where(n => n.inactive == null || !n.inactive.Value).ToList().Count.ToString();
            return _testProperty;
        }
        set
        {
            _testProperty = value;
        }
    }

    #endregion
}

(Позже я планирую использовать общий шаблон IRepository, но сейчас я просто использую этот тестовый репозиторий.)

У меня вопрос: когда объект Request удаляется, он также удаляет объект контекста в коллекции Items? Другими словами, будет ли он вызывать Dispose для каждого объекта, который может храниться в этой коллекции?

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


person Cynthia    schedule 24.02.2011    source источник
comment
Вау, что случилось с ответом, который дал Даррин (кажется, это было его имя), и несколькими комментариями, и... ?? Я пришел сюда, чтобы отметить его ответ как правильный, а теперь его здесь нет!   -  person Cynthia    schedule 24.02.2011
comment
Во всяком случае, Даррин сказал, что этот сценарий будет работать, потому что все объекты будут помечены сборщиком мусора для удаления, хотя точного времени, когда сборка мусора действительно имела место, не было. Но меня это устраивает, так как репозитории будут содержать единственные указатели на контекст, и они будут удаляться после каждого запроса.   -  person Cynthia    schedule 25.02.2011
comment
@ Синтия, Дарин удалил свой ответ, но не сказал почему. Вот комментарий, который я написал к этому ответу до того, как он его удалил: Не делайте этого! Объект, который поддерживает IDisposable, должен быть удален. Да, финализатор (не деструктор!) в конечном итоге запустится, но вы, вероятно, отодвинули свои выделения памяти на поколение назад в сборщике мусора, что привело к раздуванию памяти и зависанию приложения. Тем не менее, лучший способ в сообщении в блоге не имеет этих проблем и в порядке.   -  person Craig Stuntz    schedule 25.02.2011
comment
@Craig: Хорошо, может быть, ваш комментарий заставил его удалить свой ответ. Однако, к сожалению, я потерял ссылку на его лучший способ. Насколько я помню, он использовал Ninject для создания объекта контекста с каждым запросом и удаления его в конце. Но у него также был материал, использующий локатор сервисов MVC, который я не совсем понимаю и не думал, что у меня есть время исследовать, поэтому я как бы отверг его лучший способ. Однако, если у вас есть ссылка на это, я могу вернуться к нему.   -  person Cynthia    schedule 25.02.2011
comment
@Cynthia, ссылка здесь: buildstarted.com/2010/08/24/   -  person Craig Stuntz    schedule 25.02.2011
comment
@Craig - я начал новую тему здесь stackoverflow.com/questions/5145775/ (потому что я не обнаружил, что Ninject удаляет объекты)   -  person Cynthia    schedule 28.02.2011