2015-03-02 57 views
3

我有这样的场景。SignalR - OWIN - 多个端点

模块派生自的基类。
每个模块都有自己的信号集线器。
我想将所有模块托管在单个主机中,并以模块名称分隔。
某些模块将共享中心名称。

namespace domain.com.base 
{ 
    public class BaseClass 
    { 
     public string ApplicationName; 
    } 
} 

namespace domain.com.billing 
{ 
    public class Billing : BaseClass 
    { 
     ApplicationName = "Billing"; 
    } 
    public class NotificationHub : Hub 
    { 
     public void Credit(decimal amount) 
     { 
      Clients.All.Notify(amount); 
     } 
    } 
} 

namespace domain.com.reporting 
{ 
    public class Reporting : BaseClass 
    { 
     ApplicationName = "Reporting"; 
    } 
    public class ReportingHub : Hub 
    { 
     public Report GetReport(int Id) 
     { 
      return ReportModule.RetrieveReport(Id); 
     } 
    } 
} 

在OWIN.Startup.Configuration(IAppBuilder)是有可能做这样的事情,例如

namespace domain.com.external_access 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var asmList = GlobalResolver.Applications(); 
     foreach(var asm in asmList) 
     { 
      app.MapSignalR(asm.ApplicationName,false); 
     } 
    } 
} 

有效地给你的东西,像这样......

http://domain.com.external_access/Reporting/hubs http://domain.com.external_access/Billing/hubs

+0

你有没有尝试过:'app.MapSignalR(“/ Reporting/signalr”); app.MapSignalR(“/ Billing/signalr”); ...'? – Pawel 2015-03-02 21:15:51

+1

但是,如果两个终端都不能解决同一个中心问题,那将会很棒。 – 2015-03-03 06:50:25

回答

3

事实上,这是可行的,即使它需要一些沉重的解决方案SignalR的紧密耦合GlobalHost


下面的答案是基于我记得,我没有访问我的代码现在。如果有错误,我会尽快更新答案。

编辑:昨天晚上我做对了。只是不要因为下面写


你需要实现自己的IHubDescriptorProviderIHubActivator才能有过这Hub被发现为每一个“端点”的控制。此外,您需要为每个端点提供自己的实例HubConfiguration(从ConnectionConfiguration继承),该实例不使用全局主机依赖关系解析器。以下是这可能是什么样子:

class CustomSignalRConnectionConfiguration : HubConfiguration 
{ 
    public CustomSignalRConnectionConfiguration() 
    { 
     this.Resolver = new DefaultDependencyResolver(); 

     // configure your DI here... 
     var diContainer = new YourFavouriteDi(); 

     // replace IHubActivator 
     this.Resolver.Register(
      typeof(IHubActivator), 
      () => diContainer.Resolve<IHubActivator>()); 

     // replace IHubDescriptorProvider 
     this.Resolver.Register(
      typeof(IHubDescriptorProvider), 
      () => diContainer.Resolve<IHubDescriptorProvider>()); 

    } 
} 

为了您的单一端点然后你可以这样做:

app.Map("/endpointName", mappedApp => 
{ 
    var config = new CustomSignalRConnectionConfiguration(); 
    mappedApp.MapSignalR(config); 
}); 

祝你好运!

+0

谢谢!我一定会尝试实现这一点。并让你知道! – 2015-03-25 10:32:40