我想在发生某些事件时使用SignalR从服务A发送消息(例如,收到来自服务B的消息)。因此需要从某种处理程序调用hub方法,该处理程序不是使用依赖注入构造的。我怎么能这样做?
到目前为止,我尝试并阅读了以下内容:
所以我无法想象,处理程序如何使用依赖注入IHubContext。
也许有人之前就这样做了,并且有一个如何真正将语境注入任何类的例子。
提前感谢您,如有必要,我们将提供任何其他信息。
答案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解决方案,我认为这与您的方案有些相关。