Castle Windsor - 不知道在哪里释放使用“container.Resolve”创建的瞬态

时间:2014-01-15 11:36:52

标签: castle-windsor signalr

与我的问题相关的一些背景知识: - 我正在学习使用SignalR,它是一个客户端 - 服务器RPC框架。在服务器端,您编写了一个或多个“hub”类,这些类公开了可以远程调用的方法,有点像Web服务。当消息到达时,SignalR会实例化相应的集线器类来处理该消息,但为此,集线器类必须具有无参数构造函数。

在现实世界中,集线器类可能需要依赖性。幸运的是,SignalR允许您替换我已经完成的默认“依赖性解析器”。 SignalR Castle Windsor解析器有很多(几乎相同的)样本(例如here),但它们都依赖于调用Windsor容器的Resolve()方法。我对温莎的理解是你必须“释放你明确解决的问题”,但我无法看到我能在哪里实现这一点。

请注意,集线器被注册为瞬态,而依赖性可能是瞬态和单体的混合。

我考虑过在Dispose()方法中释放集线器的依赖关系,但这感觉不对 - 集线器需要访问Windsor容器;集线器还需要知道哪些依赖项是瞬态的,并且只尝试释放它们。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

恕我直言,你被信号R依赖解析器未能实现释放集线器的Destroy方法所困扰。

我同意在Hub的dispose方法中实现组件的发布会变得相当丑陋。要从windsor释放集线器,集线器需要调用容器上的释放,然后容器再次在集线器上调用该处置。

我认为你最好的选择是为集线器创建一个windsor拦截器,它将拦截集线器上的处理呼叫。这样只有拦截器需要知道容器,你应该能够处理你的组件。

你的拦截器可能需要一些逻辑来确定是从SignalR还是从windsor容器调用dispose。 (即如果从SignalR调用Windsor释放调用,否则继续)。您可以通过使用Thread本地存储来实现此目的。

相关问题