访问SignalR Hub,无需构造函数注入

时间:2018-04-03 06:00:56

标签: asp.net-core-2.0 asp.net-core-signalr

使用AspNetCore.SignalR(1.0.0 preview1-final)和AspNetCore.All(2.0.6),我如何在不直接在Controller中的服务器代码中调用集线器上的方法,并且在类中不能通过依赖注入制作?

大多数示例都假设服务器代码位于控制器中,并且应该询问'通过DI创建的类中的可注入参数来实现集线器。

我希望能够在未注入的代码中随时从服务器代码调用hub方法。旧的SignalR有一个支持这种方法的GlobalHost。基本上,我需要集线器成为全球单身人士。

现在,一切似乎都依赖于使用依赖注入,它引入了我不想要的依赖项!

我已经在很多地方看到过这个请求,但是没有找到合适的解决方案。

修改

更清楚的是,我需要的是以后能够访问我在object_two类的Configure例程中注册的集线器:

Startup

如果我这样注册:

app.UseSignalR(routes =>
        {
            routes.MapHub<PublicHubCore>("/public");
            routes.MapHub<AnalyzeHubCore>("/analyze");
            routes.MapHub<ImportHubCore>("/import");
            routes.MapHub<MainHubCore>("/main");
            routes.MapHub<FrontDeskHubCore>("/frontdesk");
            routes.MapHub<RollCallHubCore>("/rollcall");
            // etc.
            // etc.
        }); 

它没有用,因为我找回了一个不知情的Hub。

3 个答案:

答案 0 :(得分:2)

不,这是不可能的。请参阅david fowler https://github.com/aspnet/SignalR/issues/1831#issuecomment-378285819

的“官方”回答

如何注入hubContext

最佳解决方案是注入像IHubContext<TheHubWhichYouNeedThere> hubcontext这样的hubcontext 进入构造函数。

有关详情,请参阅:

Call SignalR Core Hub method from Controller

答案 1 :(得分:1)

感谢那些为此提供帮助的人。这就是我现在最终得到的......

在我的项目中,我可以从任何地方拨打这样的电话:

const bad = foo({ a: "" }, { a: 3 }); // error in second argument
// types of property 'a' are incompatible. 
// 'number' is not assignable to type 'never'

为了使这项工作,我在Startup.GetService<IMyHubHelper>().SendOutAlert(2); 中有这些额外的行,以便我轻松访问依赖注入服务提供者(与SignalR无关):

Startup.cs

正常的SignalR设置要求:

public static IServiceProvider ServiceProvider { get; private set; }
public static T GetService<T>() { return ServiceProvider.GetRequiredService<T>(); }
public void Configure(IServiceProvider serviceProvider){
  ServiceProvider = serviceProvider;
}

我不希望我的所有代码都必须直接调用原始的SignalR方法,所以我为每个代码创建一个帮助类。我在DI容器中注册了这个帮助器:

public void Configure(IApplicationBuilder app){
  // merge with existing Configure routine
  app.UseSignalR(routes =>
  {
    routes.MapHub<MyHub>("/myHub");
  });
}

以下是我创建MyHub类的方法:

public void ConfigureServices(IServiceCollection services){
  services.AddSingleton<IMyHubHelper, MyHubHelper>();
}

答案 2 :(得分:0)

这是一个很好的解决方案。在.NET Core 2.1中,服务提供者已配置,您无法访问已配置的对象。解决方法是创建一个范围:

   public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
    {
        ServiceProvider = serviceProvider.CreateScope().ServiceProvider;