如何从Dependency Injected类中接收IHubContext?

问题描述 投票:0回答:1

我想在发生某些事件时使用SignalR从服务A发送消息(例如,收到来自服务B的消息)。因此需要从某种处理程序调用hub方法,该处理程序不是使用依赖注入构造的。我怎么能这样做?

到目前为止,我尝试并阅读了以下内容:

  1. 我可以将上下文注入Controller并将其引导到我的处理程序。我可能会这样做,但是从顶层(控制器类)到底层(处理程序类)传递集线器上下文并不是最好的方法,它会给那些不应该知道这个上下文的类增加很多依赖,所以我我想避免这种情况。
  2. 我可以注入我的IHubContext in "any" class,但事实上,如何在我的处理程序上获取该类的实例?
  3. 使用注入的上下文将静态方法添加到类中!好吧,这有效,直到你有1个客户端,因为新的客户端静态属性将被覆盖。

所以我无法想象,处理程序如何使用依赖注入IHubContext。

也许有人之前就这样做了,并且有一个如何真正将语境注入任何类的例子。

提前感谢您,如有必要,我们将提供任何其他信息。

asp.net-core signalr signalr-hub asp.net-core-signalr
1个回答
1
投票

答案1

这是一种可能的解决方案。实施工厂模式。创建一个知道如何创建处理程序的工厂。在工厂中注入IHubContext。您可以使用以下几种方法:

  1. 通过传入IHubContext来构造Handler
  2. 在Handler中创建一个公共属性并设置IHubContext
  3. 在Handler中创建一个方法,并将IHubContext作为参数传递

您可以决定适合您的方法。通过DI在控制器中注入该工厂,并使用工厂方法获取处理程序。这样你就不会暴露IHubContext。请参阅下面的代码

public interface IHandlerFactory
{
   Handler CreateHandler();
}

public class HandlerFactory : IHandlerFactory
{
    private IHubContext _hubContext;

    public HandlerFactory(IHubContext context)
    {
        _hubContext = context;
    }
    public Handler CreateHandler()
    {
        return new Handler(param1, param2, _context);
    }    
}

然后在入口点,控制器/服务,通过DI注入工厂

public class MyController : Controller
{
    private Handler _handler;

    public MyController(IHandlerFactory factory)
    {
        _handler = factory.CreateHandler();
    }
}

然后你可以在其他方法中使用该_handler。我希望这有帮助。

答案2

另一种可能的解决方案是使用IHostedService,如果可能的话。请参阅由David Fowler issue提供的GitHub here解决方案,我认为这与您的方案有些相关。

© www.soinside.com 2019 - 2024. All rights reserved.