2015-03-02 1 views
3

J'ai un scénario en tant que tel.SignalR - OWIN - Plusieurs points d'extrémité

Une classe de base dont les modules sont dérivés.
Chaque module possède ses propres concentrateurs de signalisation.
Je souhaite héberger tous les modules dans un seul hôte, séparés par le nom du module.
Certains modules partagent des noms de concentrateur.

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); 
     } 
    } 
} 

Dans OWIN.Startup.Configuration (IAppBuilder) est-il possible de faire quelque chose comme tel

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

efficacement en vous donnant quelque chose comme si ...

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

+0

Avez-vous essayé: 'app.MapSignalR ("/Reporting/signalr "); app.MapSignalR ("/ Billing/signalr"); ...? – Pawel

+1

Ce serait génial, cependant, ne résoudrait-il pas les mêmes concentrateurs aux deux extrémités? –

Répondre

3

En fait, cela est faisable, même si cela nécessite un gros effort de contour autour de GlobalHost.


La réponse ci-dessous est basée sur ce que je me souviens, je n'ai pas accès à mon code en ce moment. Je vais mettre à jour la réponse dès que possible si les erreurs sont là.

Modifier: Je l'ai eu droit hier soir. Il suffit de faire comme écrit ci-dessous


Vous aurez besoin de mettre en œuvre votre propre IHubDescriptorProvider et IHubActivator afin d'avoir le contrôle sur lequel se trouvent Hub pour chacun de vos « points de terminaison ». De plus, vous devez fournir à chaque point de terminaison sa propre instance de HubConfiguration (qui hérite de ConnectionConfiguration) qui n'utilise pas le résolveur de dépendance de l'hôte global. Voici ce que cela pourrait ressembler à:

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>()); 

    } 
} 

Pour vos paramètres d'évaluation simples que vous pouvez faire quelque chose comme:

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

Bonne chance!

+0

Merci! Je vais certainement essayer de mettre en œuvre cela. Et laissez-vous savoir! –