【问题标题】:SignalR Hubs through Dependency InjectionSignalR Hubs 通过依赖注入
【发布时间】:2019-12-03 19:36:29
【问题描述】:

我查看了几个网页上的许多示例,最后由于每个示例的方法不同而感到非常困惑。我只想使用一个 HubBase 类,在其中定义共享集线器方法,即 OnConnected()、AddToGroup()) 和多个集线器类(HubX、HubY),在其中我为这些集线器定义特定方法。这是我尝试应用的基本结构:

ITypedHubClient:

public interface ITypedHubClient
{
    Task BroadcastData(string groupName, object data);
}


HubBase:

public class HubBase : Hub<ITypedHubClient>
{
    public readonly static ConnectionMapping<string> connections =
        new ConnectionMapping<string>();

    public override async Task OnConnected()
    {
        //
    }

    public override async Task OnDisconnected(bool stopCalled)
    {
        //
    }

    public async Task AddToGroup(string connectionId, string groupName)
    {
        //
    }


    public async Task SendMessageToAll(string user, string message)
    {
        await Clients.All.SendAsync(user, message);
    }

    public async Task SendMessageToGroup(string groupName, string message)
    {
        await Clients.Group(groupName).SendAsync(message);
    }
}


HubX:

[HubName("hubX")]
public class HubX : HubBase
{
    private readonly static IHubContext context = 
        GlobalHost.ConnectionManager.GetHubContext<HubX>();

    public static async Task SendDataToGroup(string groupName, object data)
    {
        await context.Clients.Group(groupName).refreshData(data);
    }

    public static async Task BroadcastData(object data)
    {
        await context.Clients.Group("groupX").refreshData(data);
    }
}


控制器:

public class MyController : Controller

    private IHubContext<HubX> hubContext;

    public MyController(IHubContext<HubX> hubContext)
    {
        this.hubContext = hubContext;
    }

    public JsonResult Create()
    {
        //...  
        this.hubContext.Clients.Group("groupX").BroadcastData("groupX", data);
    }

我的问题是:

1) 为了正确使用 DI 和使用 Hub 基类,应该进行哪些更改?

2) 我应该从 Controller 调用集线器方法吗?还是 Hub 类(HubX、Y)?我的意思是,在某些示例中,hubContext.Clients.All.SendMessageToAll(message) 方法直接从 Controller 调用,而在其中一些示例中调用 Hub 类中的方法,即HubX.SendMessageToAll(message);。知道哪个是最佳实践吗?

3)我应该从 Hub 或 HubBase 类继承 Hub 吗?

注意:如果您只知道上述问题之一,我也可以,我们将不胜感激。

【问题讨论】:

  • 哪个示例显示HubX.SendMessageToAll(message)?我从来没有见过。听起来像一个静态方法。

标签: c# asp.net-mvc signalr ninject signalr-hub


【解决方案1】:

1) 不要在HubX 中使用static 方法。然后在您的控制器中,更改您从 DI 询问的上下文类型:

public MyController(IHubContext<HubX> hubContext)

2) 使用hubContext.Clients.All.SendMessageToAll(message)。另一种方式似乎是使用静态方法,我有时会看到它出错。 SignalR 的设计初衷并非如此。

3) 你决定。这取决于您是否希望它继承 HubBase 的方法。

【讨论】:

  • 亲爱的加布里埃尔,非常感谢您的回复。如上所示,我根据您的建议更新了 ITypedHubClient 和 Controller。能否请您看一下,让我知道是否需要任何更新?
  • 这是我的问题:1) HubBase 和 HubX 类中的 HubBase : Hub&lt;ITypedHubClient&gt; 和 HubX : HubBase 继承是真的吗?
  • 2) 在我遵循的示例中,ITypedHubClient 类中没有定义 BroadcastData() 方法的实现。有什么错误吗?如果是这样,我应该在HubBase 中实现它吗?
  • 3) 如何使用这些方法,例如SendMessageToAll() 在HubBase?我是否也应该在ITypedHubClient 接口中定义它们并通过该接口访问?因此,您能否通过使用我的代码并定义缺失的部分来更新您的回复?提前感谢您的合作。
  • 1) 没关系,如果这是你想做的。 2)这取决于你。 3) SendMessageToAll() 在HubBase 中定义,所以没有什么能阻止你在HubBase 中使用它。就叫它:await SendMessageToAll(something)
猜你喜欢
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多