簡體   English   中英

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

[英]SignalR : How to use IHubContext<THub,T> Interface in ASP.NET MVC?

我一直在嘗試在使用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>接口 ,因此我不能將IHubContext與兩個參數( IHubContext<ChatHub, ITypedHubClient> _chatHubContext; )一起使用。 因此,我想知道是否有可能使用DI庫或方法。 如果是這樣,如何解決此問題?

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,您必須“手動注入”集線器上下文,如我在此處所述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM