【问题标题】:How to inject SignalR Hub Class (not hubcontext) into Controller如何将 SignalR Hub 类(不是 hubcontext)注入控制器
【发布时间】:2018-11-22 22:06:37
【问题描述】:
public class ComputerHub : Hub
{
    private readonly DbContext _db;
    public ComputerHub(DbContext db)
    {
       _db = db;
    }

    public Task OpenLock(string connectionId)
    {
       return Clients.Client(connectionId).SendAsync("OpenLock");
    }
...
}

Startup.cs

  public void ConfigureServices(IServiceCollection services)
  {
       ...
       services.AddSignalR();
  }
  public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  {
      ....
      app.UseSignalR(routes =>
            {
                routes.MapHub<ComputerHub>("/computerhub");
            });
      ....
  }

我想在控制器中使用 OpenLock 方法。我应该如何将 startup.cs 中的计算机集线器添加到 ServiceCollection。

【问题讨论】:

标签: signalr asp.net-core-2.1


【解决方案1】:

您似乎不明白这是如何工作的。为了简单地回答你的问题,直接注入类,它只需要注册到服务集合中,就像任何其他依赖一样:

services.AddScoped<ComputerHub>();

但是,这不会达到您想要的效果。类本身不做任何事情。赋予它权力的是集线器环境。如果您只是在没有集线器上下文的情况下注入该类的实例,则不会设置诸如 Clients (您要使用的方法使用的方法)之类的东西,并且不会具有他们实际需要的任何功能任何有用的东西。

【讨论】:

  • 感谢您的回答。你说的对。现在我在 ComputerHub 结构中注入 hubcontext。 public class ComputerHub : Hub { IHubContext&lt;ComputerHub&gt; _hubContext; public ComputerHub(IHubContext&lt;ComputerHub&gt; hubContext) { _hubcontext = hubcontext; } } 。所以我可以在我注入的任何地方使用 computerhub 类。我希望我没有做错任何事
  • @M.skr 你有没有发现更好的东西,仍然看起来很奇怪.. 我看到你上面的评论应该可以工作.. 但肯定有更清洁的方法......,你不能注入似乎很奇怪说ComputerHub 并且它已经知道方法和内部人员调用,就像你所做的那样,但是......它本身似乎很奇怪......
  • 不,我是这样做的,而且效果很好。坦白说,我没有遇到任何问题。不知道有没有更好的方法。
猜你喜欢
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多