使用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。
答案 0 :(得分:2)
不,这是不可能的。请参阅david fowler https://github.com/aspnet/SignalR/issues/1831#issuecomment-378285819
的“官方”回答如何注入hubContext :
最佳解决方案是注入像IHubContext<TheHubWhichYouNeedThere> hubcontext
这样的hubcontext
进入构造函数。
有关详情,请参阅:
答案 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;