统一处置对象

时间:2009-09-18 09:41:08

标签: unity-container ioc-container idisposable wcf-proxy

有没有办法让Unity将属性注入的对象作为拆解的一部分进行处理?

背景是我正在使用ASP.NET MVC 2,Unity和WCF的应用程序。我们编写了自己的MVC控制器工厂,它使用unity实例化控制器,并使用控制器公共属性的[Dependency]属性注入WCF代理。在页面生命周期结束时,调用控制器工厂的ReleaseController方法,并调用IUnityContainer.Teardown(theMvcController)。此时控制器按预期处理,但我还需要处理注入的wcf代理。 (实际上我需要对它们调用Close和/或Abort而不是Dispose但这是后来的问题。)

我当然可以覆盖控制器的Dispose方法并清理那里的代理,但我不希望控制器必须知道注入接口的生命周期,甚至是它们引用WCF代理。

如果我需要自己编写代码 - 最好的扩展点是什么?我很欣赏任何指针。

3 个答案:

答案 0 :(得分:1)

我已经创建了一个统一扩展,它将负责处理TearDown上容器创建的实例。

请参阅http://www.neovolve.com/2010/06/18/unity-extension-for-disposing-build-trees-on-teardown/

答案 1 :(得分:0)

一种可能的解决方法是,您还可以在代理周围编写一个包装器(在处理实例时由Unity调用)调用代理的Close方法。这对你来说是一个可行的方案吗?

答案 2 :(得分:0)

一旦你有了你的 UnityDependencyResolver

GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);

然后您可以在解析器上调用 Dispose。在 ASP.NET 中,您可以选择从 Global.asax.cs Application_End 方法中调用它,如下所示:

GlobalConfiguration.Configuration.DependencyResolver.Dispose();

然后这将对所有具有容器生命周期的东西调用 dispose,例如添加到容器中的实例:

var myFooInstance = new Foo();
container.RegisterInstance<IFoo>(myFooInstance);