我希望能够将一个SignalR集线器作为依赖项注入到其他类中,这样我就可以从服务器代码向它发送消息(独立于来自Javascript客户端的直接AJAX调用)。像这样:
private readonly IMyApplicationHub _signalHub;
public HomeController(IMyApplicationHub signalHub)
{
_signalHub = signalHub;
}
但是,我不知道如何告诉Autofac使用哪个集线器实例 - 它似乎与真实客户端打开其连接时创建的实例不同。
我发现,如果我想引用SignalR正在使用的“真实”中心实例,我必须维护自己的Singleton引用并在第一次设置它时(在本例中为Init)从真正的Javascript客户端调用。
public class MyApplicationHub : Hub, IMyApplicationHub
{
public static MyApplicationHub SingleInstance = null;
public void Init(string message)
{
SingleInstance = this;
}
internal void SendMessage(string message, IEnumerable<LinkDto> links)
{
Clients.siteReceived(message);
}
}
我一定错过了什么。任何援助将不胜感激! (最后,我还想知道如何构造函数 - 将依赖关系注入SignalR中心本身,但这似乎是一个稍微不同的问题。)
答案 0 :(得分:4)
不要创建集线器的实例。您不应该创建控制器的实例。 documentation向您展示了如何在集线器之外获取集线器客户端的实例。
集线器是每次调用,相当于每个请求中mvc中的控制器的方式,并且您不拥有它们的创建。