【发布时间】:2019-04-23 11:10:16
【问题描述】:
我想在发生某些事件时使用 SignalR 从 Service A 发送消息(例如,收到来自 Service B 的消息)。 因此需要从某种处理程序调用集线器方法,该处理程序不是使用依赖注入构造的。我该怎么做?
到目前为止,我尝试并阅读了以下内容:
- 我可以将上下文注入控制器并将其引导至我的处理程序。我可能可以这样做,但是将集线器上下文从顶部(控制器类)传递到底部(处理程序类)并不是最好的方法,这会给不应该知道这个上下文的类添加很多依赖项,所以我希望避免这种情况。
- 我可以注入我的 IHubContext in "any" class,但问题是,如何在我的处理程序上获取该类的实例?
- 向具有注入上下文的类添加静态方法!?好吧,这在您拥有 1 个客户端之前有效,因为新客户端的静态属性将被覆盖。
所以我无法想象,处理程序如何使用依赖注入的 IHubContext。
可能有人以前做过,并且有一个如何将上下文真正注入 any 类的示例。
提前感谢您,如有必要,我们将提供任何其他信息。
【问题讨论】:
-
你在什么时候构建你的处理程序?我想,处理程序不是起点,否则,您可以使用
AddSingleton或其他Add*方法将其添加到 Startup 类中的 DI。然后使用ServiceProvider解决它,这将自动解决我的处理程序的 IHubContext 依赖关系。您能否详细说明更多代码? -
@ShahzadHassan 经过一番思考。是的,处理程序不是入口点。每次服务启动时创建一次处理程序,因此多个客户端可以连接到该服务并通过该处理程序。另一方面,根据method call 创建一个集线器实例。我想我应该从问题中删除带有“理想解决方案”的那一行。
-
恐怕在这种情况下选择是有限的。 DI从上到下工作,但首先解决内部依赖关系,所以如果A对B有依赖关系,B对C有依赖关系。它会先解决B的依赖关系,然后再去A。我猜,你是新的在控制器内部的某个位置启动处理程序?为什么不为处理程序实现一个接口并将其注入控制器?这样它将由 DI 解决
-
@ShahzadHassan 不,我不是在控制器内新建处理程序。基本上,只有在服务重新启动时才会重建处理程序。另外,我无法为处理程序实现和注入接口,因为处理程序有一些其他依赖项不是由 DI 构造的。
标签: asp.net-core signalr signalr-hub asp.net-core-signalr