我想在发生某些事件时使用SignalR从服务A 发送消息(例如,收到来自服务B 的消息)。 因此,需要从某种处理程序中调用集线器方法,而该处理程序不是使用依赖注入构造的。我该怎么做?
到目前为止,我尝试并阅读了以下内容:
所以我无法想象,处理程序如何使用依赖注入的IHubContext。
可能有人曾经这样做过,并有一个示例说明了如何将上下文真正注入 any 类。
在此先感谢您,并在需要时提供其他信息。
答案 0 :(得分:1)
答案1
这是一种可能的解决方案。实施工厂模式。创建一个知道如何创建处理程序的工厂。在工厂中注入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解决方案,我认为这与您的情况有些相关。