2017-10-18 9 views
0

J'ai un class que je veux obtenir le Cloudscribe SiteId mais je ne sais pas comment y accéder.Accéder à CloudScribe SiteID en dehors du contrôleur ou des vues

Si j'utilisais un controller alors je serais capable de compter sur le SiteContext pour être DI'd dans le constructeur mais cela ne fonctionne pas dans cette instance.

Quelqu'un peut-il me dire comment je peux accéder à la propriété SiteId dans le code ci-dessous?

using Microsoft.AspNetCore.SignalR; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 

namespace CoLabR 
{ 
    public class Messaging : Hub 
    { 
     private string _siteId; 

     public Messaging() 
     { 
      //Code here to get SiteID 
      _siteId = "<<Code for getting Site ID"; 
     } 

     public Task Post(string message) 
     { 

      return Clients.Group(_siteId).InvokeAsync("Post", message); 
     } 

     public Task JoinRoom() 
     { 
      Groups.AddAsync(Context.ConnectionId, _siteId); 
      return Clients.Group(_siteId).InvokeAsync("Post", Context.User.Identity.Name + " joined. " + _siteId); 
     } 

    } 
} 

Répondre

1

SignalR de base prend en charge l'injection dans les moyeux de sorte que vous devriez être en mesure d'injecter juste SiteContext dans Messaging. Here est une question connexe qui montre comment faire cela.

+0

Merci @Pawel J'ai supposé à tort que le SiteContext pouvait déjà être injecté dans les contrôleurs sur le site, il fonctionnerait aussi pour mon Hub, mais il semble que je devais le référencer explicitement dans mon 'startup.cs' –

0

Bien que la réponse de @Pawel m'a aidé, ma solution finale différait. J'ai essayé d'enregistrer SiteContext dans mon Startup.cs et d'injecter SiteContext dans mon constructeur pour le Hub mais il a gardé un SiteID différent à chaque chargement de page (ou si j'ai utilisé Singleton, il m'a donné le même SiteId sur plusieurs Sites CloudScribe).

En fin de ma solution était de changer le constructeur Hub au code ci-dessous

public Messaging(SiteUserManager<SiteUser> userManager) 
    { 
     //Code here to get SiteID 
     _siteId = userManager.Site.Id.ToString(); 
    } 

Cela m'a donné une SiteId cohérente pour chaque site locataire dans ma demande.