如何将 SignalR 集线器类(不是集线器上下文)注入控制器

M.s*_*skr 3 signalr asp.net-core-2.1

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");
    }
...
}
Run Code Online (Sandbox Code Playgroud)

启动文件

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

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

Chr*_*att 6

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

services.AddScoped<ComputerHub>();
Run Code Online (Sandbox Code Playgroud)

但是,这不会按照您的意愿行事。类本身不做任何事情。是集线器上下文赋予它权力。如果您只是在没有集线器上下文的情况下简单地注入类的实例,则不会设置诸如Clients(您要使用的方法使用的方法)之类的东西,并且不会具有它们实际执行任何有用操作所需的任何功能。