Что должен делать метод UnityContainer.Teardown? - PullRequest
6 голосов
/ 08 февраля 2011

Я хотел бы явно "освободить" экземпляр объекта, разрешенный Unity.Я надеялся, что метод Teardown должен использоваться именно для этого, поэтому я попробовал что-то вроде этого:

container.RegisterType(typeof(IMyType), typeof(MyType), 
    new MyLifetimeManager());
var obj = container.Resolve<IMyType>();
...
container.Teardown(obj);

MyLifetimeManager сохраняет экземпляр объекта в HttpContext.Current.Items.Я ожидал, что метод Teardown вызовет RemoveValue для менеджера времени жизни и освободит как экземпляр MyType, так и экземпляр менеджера времени жизни.Не работаетПрежде всего, RemoveValue не вызывается, и если я снова позвоню Resolve<IMyType>, я получу ранее разрешенный экземпляр.

Что должен делать метод Teardown?Как я могу освободить объект, несмотря на его менеджер времени жизни?

Редактировать:

Если Teardown не освобождает экземпляр, кто это делает?Кто звонит RemoveValue на пожизненный менеджер?

1 Ответ

4 голосов
/ 08 февраля 2011

Unity TearDown ничего не делает из коробки.Вам не нужно удалять из HttpContext.Current.Items, так как он будет очищен автоматически в конце запроса.Что вы можете сделать, это вызвать Dispose для любого объекта IDisposable, хранящегося там.Это можно сделать из EndRequest в Global.asax:

foreach (var item in HttpContext.Current.Items.Values)
            {
                var disposableItem = item as IDisposable;

                if (disposableItem != null)
                {
                    disposableItem.Dispose();
                }
            }
...