2017-10-18 70 views
0

我有一個class,我想要Cloudscribe SiteId,但我不確定如何訪問它。在Controller或Views外部訪問Cloudscribe SiteID

如果我使用的是controller,那麼我將能夠依賴SiteContext將DI'd轉換爲構造函數,但在這種情況下不起作用。

有人能告訴我如何在下面的代碼中訪問SiteId屬性?

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

    } 
} 

回答

1

SignalR內核支持注入樞紐,所以你應該能夠只注入SiteContextMessagingHere是一個相關的問題,顯示如何做到這一點。

+0

謝謝@Pawel我錯誤地認爲,因爲SiteContext可能已經注入到網站上的控制器中,它也適用於我的集線器,但看起來我需要在我的'startup.cs'中明確地引用它。 –

0

儘管@Pawel的答案對我有幫助,但我的最終解決方案卻有所不同。我嘗試在我的Startup.cs中註冊SiteContext,並將SiteContext注入到我的Hub構造函數中,但它在每次頁面加載時都會返回一個不同的SiteID(或者如果我使用Singleton,它會爲多個CloudScribe站點提供相同的SiteId)。

在結束我的解決辦法是把集線器構造改變爲下面的代碼

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

這給了我一個一致的SITEID在我的應用程序中每個租戶的網站。