我有一些SignalR信令中心,可能需要访问一些短暂的和单例依赖项。挂钩Hub的创建很容易,也很有效,但是SignalR会在创建的Hub上执行自己的Dispose()调用,而不是通知依赖项解析器并让其参与处理。
如果依赖关系已注册为单例,则这并不是太大的问题,但是如果它们已注册为瞬态,则它们将永远不会被处理(如果需要),并且Windsor将保持它们处于活动状态,直到收集Windsor容器(当Web服务器关闭时)。
我看到几种可能的处理方式...
a)这里有人指出了一种子类化SignalR的HubDispatcher类的方法,以便可以进行适当的清理。 它不是SignalR标准DependencyResolver的一部分,因此可能很难/不可能实现
b)SignalR中的其他类,管道的其他地方,可以被覆盖或轻松替换,以便我们可以子类化HubDispatcher并确保使用该子类。 从我所了解的情况来看,这必须是Owin中间件类HubDispatcherMiddleware。 是否有某种方法可以强制Owin不注册此类,而是注册我的此类版本(反过来使用我的自己的HubDispatcher)?
c)有一种方式可以拦截SignalR对我的Hub类所做的Dispose()调用,以便可以向Windsor发出调用,确保任何依赖项都被正确处理并从容器中释放
d)刻意避免使用瞬态生命周期依赖项,而是传递类型工厂,以便我们可以通过Hub内的类型化工厂解析和释放每个依赖项
目前,我只知道如何执行(d)。 (a)或(b)将很棒。 (c)主要由这篇文章http://kozmic.net/2010/01/27/transparently-releasing-components-in-windsor/涵盖,但是拦截程序需要通过IDisposable调用Dispose()。 SignalR的HubDispather类对中心清理的实现为
private static void DisposeHubs(IEnumerable<IHub> hubs)
{
foreach (var hub in hubs)
{
hub.Dispose();
}
}
不需要对IDisposable进行强制转换......另外,Hub类上的Dispose()是虚拟的,并且这篇博客暗示了虚拟Dispose()可能会增加一些复杂性(我不确定有多少复杂性,也不知道Castle的拦截器是否可以规避掉那个未转换为IDisposable的问题)。
我知道我的问题只适用于很小众的用户——那些使用Windsor和SignalR并关心除了解决依赖项之外的内容。我找到的每一个例子,包括StackOverflow上的那些,似乎都忽略了依赖项的释放。
谢谢!