StructureMap InstanceScope.Hybrid и IDisposable - PullRequest
7 голосов
/ 02 февраля 2009

Я работаю над приложением asp.net-mvc. Контекст данных linq передается в мои сервисные объекты структурной картой. У меня есть набор для гибрида. Это все работает просто отлично.

protected override void configure()
{
    ForRequestedType<AetherDataContext>()
        .TheDefaultIs(() => new AetherDataContext())
        .CacheBy(InstanceScope.Hybrid);
}

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

У кого-нибудь есть идеи?

Если кто-то не понял, что может вызвать исключения из моей памяти?

Обновление:

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

protected override void Dispose(bool disposing)
{
    Debug.WriteLine("Disposing: " + DateTime.Now);
    base.Dispose(disposing);
}

public new void Dispose()
{
    Debug.WriteLine("Disposing: " + DateTime.Now);
    base.Dispose();
}

Я не совсем уверен, что делаю это правильно, я предполагаю, что новый метод будет вызван?

Во всяком случае, ни одна из точек торможения не была поражена. Однако конструктор для одного и того же класса вызывался при каждом запросе. Не идеал, я думаю.

Ответы [ 3 ]

4 голосов
/ 02 февраля 2009

Хорошо, поэтому последняя версия StructureMap (2.3.5) имеет полезный маленький метод, который называется

HttpContextBuildPolicy.DisposeAndClearAll();
Удобные методы очистки для HttpContext и ThreadLocal. HttpContextBuildPolicy.DisposeAndClearAll (), ThreadLocalStoragePolicy.DisposeAndClearAll (). Вызов любого метода приведет к удалению всех кэшированных экземпляров и вызову IDispose, если объект является IDisposable.

Ранее методы dispose не вызывались, я добавил это в Application_EndRequest, и теперь они есть. Я надеюсь, что это решит некоторые проблемы с памятью.

Посмотрим.

1 голос
/ 02 февраля 2009

Это почти точная копия вопроса, который я задал 2 дня назад: Сессия, содержащая элементы, реализующие IDisposable

InstanceScope.Hybrid просто хранит объект внутри HttpContext.Current.Items, если он существует, или хранилище ThreadLocal в противном случае, а InstanceScope.HttpSession работает так же, как и использует HttpSession и ThreadLocal. Коллекция предметов живет по запросу, поэтому, если вы реализуете шаблон, указанный в моем вопросе, вы должны увидеть Уничтожение стрельбы в конце текущего запроса.

0 голосов
/ 03 февраля 2009

Итак, решение; его Кассини вызывает проблемы. В основном это создает новый контекст для каждого запроса. Вот почему я видел, как контекст создавался снова, почему он не вызывал «одноразовый», я не знаю. Но снова я готов поверить, что это как-то связано с Кассини.

...