Доступ к Cloudscribe SiteID вне контроллера или представлений

У меня есть class, и я хочу получить Cloudscribe SiteId, но не знаю, как получить к нему доступ.

Если бы я использовал controller, то я мог бы полагаться на SiteContext для DI в конструкторе, но в данном случае это не работает.

Может ли кто-нибудь сказать мне, как я могу получить доступ к свойству 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);
        }

    }
}

person Chris Morledge    schedule 18.10.2017    source источник


Ответы (2)


SignalR Core поддерживает внедрение в концентраторы, поэтому вы сможете просто внедрить SiteContext в Messaging. Вот связанный вопрос, который показывает, как это сделать.

person Pawel    schedule 19.10.2017
comment
Спасибо @Pawel. Я ошибочно предположил, что SiteContext уже может быть введен в контроллеры на сайте, он также будет работать для моего концентратора, но похоже, что мне нужно было явно указать его в моем startup.cs - person Chris Morledge; 19.10.2017

Хотя ответ от @Pawel помог мне, мое окончательное решение отличалось. Я попытался зарегистрировать SiteContext в моем Startup.cs и внедрить SiteContext в мой конструктор для концентратора, но он продолжал возвращать другой SiteID при каждой загрузке страницы (или, если я использовал Singleton, он давал мне один и тот же SiteId на нескольких сайтах CloudScribe).

В конце концов, мое решение состояло в том, чтобы изменить конструктор концентратора на приведенный ниже код.

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

Это дало мне согласованный SiteId для каждого сайта арендатора в моем приложении.

person Chris Morledge    schedule 19.10.2017