2016-10-11 83 views
1

我似乎无法看到以下代码工作。我正在做的是在ConfigureServies呼叫_serviceProvider.GetService<IConnectionManager>();,并将其保存在一个静态字段,并试图稍后使用它来访问IConnectionManager,随后致电GetHubContext<MyHub>,以便我可以向所有连接的客户端广播消息。获取SignalR IConnectionManager GetHubContext在aspnet核心中的Startup.cs中工作

_connectionManager.GetHubContext<MyHub>().Clients.All.doSomethingOnClients(); 

就像测试一样,webapi控制器中的同一行代码行为方法工作正常! (通过构造函数注入IConnectionManager)。这让我相信我的信号设置非常好,就是我在初创课上得到的东西在某个地方是错的。 GetHashCodeIConnectionManager在启动和我的控制器给出不同的哈希码。我只需要在ApplicationLifetime OnStartUp上挂钩...

你能帮我理解哪里出了问题吗?

public class Startup 
{ 
    public static IServiceProvider _serviceProvider; 
    public static IConnectionManager _connectionManager; 
    private readonly IHostingEnvironment _hostingEnv; 
    public IConfigurationRoot Configuration { get; } 

    public Startup (IHostingEnvironment env) 
    { 
     // ... 
    } 
    public void ConfigureServices (IServiceCollection services) 
    {    
     // .... 
     services.AddSignalR(options => { 
      options.Hubs.EnableDetailedErrors = true; 
     }); 

     services.AddMvc(); 
     // ... 
     _serviceProvider = services.BuildServiceProvider(); 
     _connectionManager = _serviceProvider.GetService<IConnectionManager>(); 
    } 

    public void Configure (IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime applicationLifetime) 
    { 
     // ... 
     applicationLifetime.ApplicationStarted.Register(OnStartUp); 
     // ... 
     app.UseMvc(routes => { 
      routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}"); 
     }); 
     app.UseSignalR(); 
     // ... 
    } 

    public void OnStartUp() 
    { 
     var x = _serviceProvider.GetService<MySingletonObject>(); 
     // MySingletonObject has a VersionUpdated event handler 
     x.VersionUpdated += OnUpdate; 
    } 

    private void OnUpdate (object sender, EventArgs e) 
    { 

     // I get here everytime my singleton gets updated fine! 
     // but the following does not work 
     _connectionManager.GetHubContext<MyHub>().Clients.All.doSomethingOnClients();  
    } 

} 

我使用 “Microsoft.AspNetCore.SignalR.Server/0.2.0-alpha1-22362”。

+0

[如何在ASP.NET Core中获取SignalR Hub上下文](https://stackoverflow.com/a/46319153/428061) – Soren

回答

2

第一件事就是要实现这个版本的SignalR不是出货,它只是阿尔法。您遇到的问题是因为您正在构建2个服务提供商,而且他们没有互相交流。您可以拨打BuildServiceProvider(),而不是将IConnectionManager注入您的配置方法。您还可以通过直接向配置中注入依赖关系,然后在回调中使用它们来清理很多服务定位器模式。

public class Startup 
{ 
    public IConfigurationRoot Configuration { get; } 

    public Startup (IHostingEnvironment env) 
    { 
     // ... 
    } 

    public void ConfigureServices (IServiceCollection services) 
    {    
     // .... 
     services.AddSignalR(options => { 
      options.Hubs.EnableDetailedErrors = true; 
     }); 

     services.AddMvc(); 
     // ... 
    } 

    public void Configure (IApplicationBuilder app, 
         IHostingEnvironment env, 
         ILoggerFactory loggerFactory, 
         IApplicationLifetime applicationLifetime, 
         MySingletonObject obj, 
         IHubContext<MyHub> context) 
    { 
     // ... 
     applicationLifetime.ApplicationStarted.Register(() => OnStartUp(obj, context)); 
     // ... 
     app.UseMvc(routes => { 
      routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}"); 
     }); 
     app.UseSignalR(); 
     // ... 
    } 

    public void OnStartUp(MySingletonObject obj, IHubContext<MyHub> context) 
    { 
     // MySingletonObject has a VersionUpdated event handler 
     obj.VersionUpdated += (sender, e) => 
     { 
      context.Clients.All.doSomethingOnClients(); 
     }; 
    } 

} 

即使清洁将是一个让你不使用你的启动方法这么多的争论最终将构成一切其他服务。

+0

非常感谢David,非常感谢您的回答,感谢代码审查,我忘了我可以向Configure方法注入任何东西。现在工作得很好! – salek