Signalr 如何将信号集线器类(而不是hubcontext)注入控制器

Signalr 如何将信号集线器类(而不是hubcontext)注入控制器,signalr,asp.net-core-2.1,Signalr,Asp.net Core 2.1,Startup.cs public class ComputerHub : Hub { private readonly DbContext _db; public ComputerHub(DbContext db) { _db = db; } public Task OpenLock(string connectionId) { return Clients.Client(connectionId).SendAsyn

Startup.cs

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");
    }
...
}
public void配置服务(IServiceCollection服务)
{
...
services.AddSignalR();
}
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
....
app.usesigner(路由=>
{
routes.MapHub(“/computerhub”);
});
....
}

我想在控制器中实现OpenLock方法。我应该如何在startup.cs中向ServiceCollection添加computerhub。

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

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

然而,这并不是你想要的。这个类本身什么都不做。这是中心环境赋予它的力量。如果您只是在没有中心上下文的情况下注入类的实例,那么像
客户机
(您要使用的方法使用的)这样的东西将不会被设置,也不会具有实际执行任何有用操作所需的任何功能。

您看到了吗:谢谢您的回答。你是对的。现在,我将hubcontext注入ComputerHub ConstructOctur<代码>公共类ComputerHub:Hub{IHubContext\u hubContext;公共ComputerHub(IHubContext hubContext){{uHubContext=hubContext;}}。所以我可以在我注入的任何地方使用computerhub类。我希望我没有做错任何事
services.AddScoped<ComputerHub>();