Единство распоряжаться объектом
Есть ли способ заставить Unity утилизировать объекты с введенными свойствами как часть Teardown?
Фоном является то, что я работаю над приложением, которое использует ASP.NET MVC 2, Unity и WCF. Мы написали нашу собственную фабрику контроллеров MVC, которая использует единицу для создания экземпляра контроллера, а прокси WCF внедряются с использованием атрибута [Dependency] в открытых свойствах контроллера. В конце жизненного цикла страницы вызывается метод ReleaseController фабрики контроллеров, и мы вызываем IUnityContainer.Teardown(theMvcController). В этот момент контроллер удаляется, как и ожидалось, но мне также нужно избавиться от введенных wcf-прокси. (На самом деле мне нужно вызвать Close и / или Abort для них, а не Dispose, но это более поздняя проблема.)
Конечно, я мог бы переопределить методы Dispose контроллеров и очистить прокси-серверы там, но я не хочу, чтобы контроллеры знали о жизненном цикле внедряемых интерфейсов или даже о том, что они ссылаются на прокси WCF.
Если мне нужно написать код для этого самому, что будет лучшей точкой расширения? Буду признателен за любой указатель.
3 ответа
Я создал расширение для единицы, которое позаботится об удалении экземпляров, созданных контейнером в TearDown.
См. http://www.neovolve.com/2010/06/18/unity-extension-for-disposing-build-trees-on-teardown/
Возможный обходной путь заключается в том, что вы также можете написать оболочку вокруг ваших прокси, которая при утилизации (вызываемая Unity при удалении экземпляров) вызывает метод Close прокси. Это жизнеспособный сценарий для вас?
Как только вы получите свой UnityDependencyResolver
GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
Затем вы можете вызвать Dispose на распознавателе. В ASP.NET вы можете вызвать это из своего метода Application_End Global.asax.cs следующим образом:
GlobalConfiguration.Configuration.DependencyResolver.Dispose();
Затем это вызовет dispose для всех вещей, у которых есть время существования контейнера , таких как экземпляры, добавленные в контейнер с помощью:
var myFooInstance = new Foo();
container.RegisterInstance<IFoo>(myFooInstance);