2015-03-02 48 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