gpt4 book ai didi

inversion-of-control - SignalR with IoC (CaSTLe Windsor) - 集线器的生命周期是多少?

转载 作者:行者123 更新时间:2023-12-04 17:49:23 25 4
gpt4 key购买 nike

我刚刚开始使用 SignalR,并为 SignalR 创建了一个自定义解析器,因此我可以使用 CaSTLe Windsor 通过集线器构造函数注入(inject)依赖项。

我有点假设我只需要注册依赖项,但我发现在我的应用程序运行之前还需要注册集线器本身。这是预期的吗?如果是这样,我应该为集线器使用多长的生命周期?

最佳答案

默认情况下,SignalR 不会向依赖解析器注册每个集线器。相反,它使用 IAssemblyLocator查找可能包含 SignalR 集线器的可用程序集。然后 IHubDescriptorProvider搜索集线器的所有可用程序集并创建 HubDescriptor s。

最后,IHubActivator需要 HubDescriptor并返回一个新实例化的 SignalR 集线器(使用 Activator.CreateInstance ),除非集线器类型与 HubDescriptor 关联已向依赖解析器注册。在后一种情况下,集线器从 IHubActivator 返回。将直接从依赖解析器中获取。

通常 SignalR 集线器是短暂的,这意味着它们会为每个集线器方法调用创建和销毁。这意味着如果您使用 SignalR 的依赖解析器注册您的 Hub,您应该确保每次 SignalR 解析 Hub 类型时都返回一个新的 Hub 实例。

我强烈建议不要注册单例集线器,原因如下:

  • 集线器方法可以并行调用。发生这种情况时,Hub.Context可以作为另一个方法调用的设置的一部分被覆盖。这可能会导致非常微妙的错误。例如,对于单例集线器,以下代码可能会将调用者以外的连接添加到组(这显然可能是一个很大的安全问题):

    [Authorize(Roles="Admin")]
    public async Task JoinAdminGroup()
    {
    await Groups.Add(Context.ConnectionId, "admin");
    }
  • Hub.Dispose每次激活后都会调用。如果你一直返回同一个 Hub,它的 Dispose 方法将被重复调用。除非您在集线器上实现 Dispose,否则这可能不会影响您,因为默认的 Dispose 实现当前无操作。
  • IIS 回收 AppDomain。发生这种情况时,无论如何您都将被迫重新实例化您的集线器。请记住,SignalR 将在您的应用程序在短时间内不可用后自动重新建立事件连接(就像 AppDomain 回收的情况一样),因此即使您注册,您也可以很好地拥有一个新实例化的 Hub 来处理预先存在的连接您的 Hub 作为具有依赖关系解析器的单例。

  • https://github.com/SignalR/SignalR/blob/2.0.1/src/Microsoft.AspNet.SignalR.Core/DefaultDependencyResolver.cs#L79

    关于inversion-of-control - SignalR with IoC (CaSTLe Windsor) - 集线器的生命周期是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21111436/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com