【问题标题】:Castle Windsor - not sure where to release transients created using "container.Resolve"Castle Windsor - 不确定在哪里释放使用“container.Resolve”创建的瞬变
【发布时间】:2014-01-15 20:16:08
【问题描述】:

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

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

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

我曾考虑在其Dispose() 方法中释放集线器的依赖项,但这感觉不对——集线器需要访问温莎容器;集线器还需要知道哪些依赖项是暂时的,并且只尝试释放这些依赖项。

有什么想法吗?

【问题讨论】:

    标签: castle-windsor signalr


    【解决方案1】:

    恕我直言,信号 R 依赖解析器未能实现用于释放集线器的 Destroy 方法这一事实让您感到困扰。

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

    我认为最好的办法是为集线器创建一个温莎拦截器,它将拦截集线器上的 dispose 调用。这样只有拦截器需要知道容器,你应该能够处理你的组件。

    您可能需要拦截器中的一些逻辑来确定是从 SignalR 还是从那时的 Windsor 容器调用 dispose。 (即,如果从 SignalR 调用 Windsor release,否则继续)。您可以通过使用例如线程本地存储来做到这一点。

    【讨论】:

    • 我不认为会有一个优雅的解决方案!我担心一个集线器被实例化以服务每个方法调用,所以如果事情没有得到解决,就有可能出现内存问题。我想知道将集线器注册为单例是否更容易?我知道 SignalR 在方法完成后调用集线器的 Dispose() ,所以只要我没有在那里做任何事情,我想我应该没问题? (我使用的是自托管,而不是 IIS,如果这有影响的话)。
    • 我对 SignalR 不是很熟悉,但总的来说,我会假设一个对象在处理后将不再可用。如果你要切换到单例,你能确定你永远不会同时需要两个 Hub 实例吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多