SignalR:如何在ASP.NET MVC中使用IHubContext <THub,T>接口?

时间:2019-07-29 09:11:33

标签: c# asp.net-mvc dependency-injection signalr

我一直在使用Microsoft.AspNet.SignalR库的ASP.NET MVC项目中尝试使用以下方法:

public interface ITypedHubClient
{
  Task BroadcastMessage(string name, string message);
}

从中心继承:

public class ChatHub : Hub<ITypedHubClient>
{
  public void Send(string name, string message)
  {
    Clients.All.BroadcastMessage(name, message);
  }
}

将类型化的hubcontext注入到控制器中,并使用它:

public class DemoController : Controller
{   
  IHubContext<ChatHub, ITypedHubClient> _chatHubContext;

  public DemoController(IHubContext<ChatHub, ITypedHubClient> chatHubContext)
  {
    _chatHubContext = chatHubContext;
  }

  public IEnumerable<string> Get()
  {
    _chatHubContext.Clients.All.BroadcastMessage("test", "test");
    return new string[] { "value1", "value2" };
  }
}

但是,Microsoft.AspNet.SignalR库中没有IHubContext<THub,T> Interface,因此我不能将IHubContext与两个参数(IHubContext<ChatHub, ITypedHubClient> _chatHubContext;)一起使用。因此,我想知道是否有可能使用DI库或方法。如果是这样,如何解决此问题?

1 个答案:

答案 0 :(得分:1)

Microsoft.AspNetCore.SignalR包含IHubContext用于未键入的集线器

public interface IHubContext<THub> where THub : Hub
{
    IHubClients Clients { get; }
    IGroupManager Groups { get; }
}

以及键入的中心

public interface IHubContext<THub, T> where THub : Hub<T> where T : class
{
    IHubClients<T> Clients { get; }
    IGroupManager Groups { get; }
}

从声明中可以看到,THub参数没有在任何地方使用,实际上它仅用于依赖项注入。

Microsoft.AspNet.SignalR依次包含以下IHubContext声明

// for untyped hub
public interface IHubContext
{
    IHubConnectionContext<dynamic> Clients { get; }
    IGroupManager Groups { get; }
}

// for typed hub
public interface IHubContext<T>
{
    IHubConnectionContext<T> Clients { get; }
    IGroupManager Groups { get; }
}

如您所见,在这种情况下,接口不包含THub参数,这是不需要的,因为ASP.NET MVC尚未为SignalR内置DI。对于使用类型化的客户端,在您的情况下使用IHubContext<T>就足够了。要使用DI,您必须按照我的描述here“手动注入”中心上下文。