Как я могу получить HubContext (SignalR) внутри класса с параметрами другого конструктора? - PullRequest
0 голосов
/ 15 октября 2018

У меня есть класс, у которого есть некоторые параметры в конструкторе.

public class ServerStatus
    {   
       private int idserver;
       private string des;
       private string ipserver;

       private int attemptfailded = 0;

        public ServerStatus(int id, string description, string ip)
        {
            this.idserver = id;
            this.des = description;
            this.ipserver = ip;    
        }

       ... /* Other logic of this class: like notification management */

    }

Теперь я хочу добавить в этот класс экземпляр контекста концентратора, подобного этому, и иметь метод, который использует этот концентратор.например, контекст.

public class ServerStatus
{
   private readonly IHubContext<MyHub, ITypedHubClient> _hubContext;

   private int idserver;
   private string des;
   private string ipserver;

   private int attemptfailded = 0;

    public ServerStatus(IHubContext<MyHub, ITypedHubClient> hubContext, int id, string description, string ip)
    {
        this.idserver = id;
        this.des = description;
        this.ipserver = ip;
        _hubContext = hubContext;

    }

   ...

   public async Task SendMessageToClients()
   {       
        await _hubContext.Clients.All.BroadcastMessage("Server", 
        "ServerDown");
   }

}

В частности, я хочу, чтобы этот класс создавался где угодно, например, если у меня есть другой класс, который реализует список этого объекта ServerStatus, мне нужно вызватьконструктор из этого класса.Это пример:

public static class MyClass
{

    public static List<ServerStatus> servers = new List<ServerStatus>();

    public static void initializeServers()
    {
        foreach (/* server I have in a Database */)
        {

            ServerStatus s = new ServerStatus (/* the hub context and the parameters of the server */)

            servers.Add(s);
        }
    }
}

Мой вопрос таков: как я могу добавить это hubContext в мой класс и создать объекты, где они мне нужны.

Помните, я уже настроил всю библиотеку SignalR, и это работает, но теперь я не понимаю, как передать hubContext классу, который в этом нуждается.

1 Ответ

0 голосов
/ 16 октября 2018

Должен ли ваш класс быть статичным?

Когда вы регистрируете свои классы / сервисы в ConfigureServices, они регистрируются в .NET Core Service Provider.С помощью нестатических классов вы можете внедрить этот интерфейс и использовать его для запроса зарегистрированных сервисов у основного поставщика услуг .NET, например:

public class MyClass
{
    private readonly IServiceProvider _provider;

    public MyClass(IServiceProvider provider)
    {
        _provider = provider;
    }

    public void InitializeServers()
    {
        foreach(/* server I have in database */)
        {
            var hub = _provider.GetService<IHubContext<MyHub, ITypedHubClient>>();

            ServerStatus s = new ServerStatus(hub, ...);
        }
    }
}

. Вы можете использовать IServiceProvider для получения любых сервисов, которые были зарегистрированы вэто, в том числе ваш IHubContext.Внутренне .NET Core использует поставщика услуг для внедрения сервисов в ваши зарегистрированные сервисы / контроллеры и т. Д. При его создании.В этом случае вы просто делаете то же самое, что и он, но вручную.

ПРИМЕЧАНИЕ. Вам нужно будет зарегистрировать MyClass в startup.cs, чтобы поставщик услуг был внедрен в конструктор.Например:

services.AddSingleton<MyClass>();

Но теперь, когда вы зарегистрировали MyClass у поставщика услуг, вы можете просто вставить свою зависимость непосредственно в MyClass

public class MyClass
{
    private readonly IHubContext<MyHub, ITypedHubClient> _hubContext;

    public MyClass(IHubContext<MyHub, ITypedHubClient> hubContext)
    {
        _hubContext = hubContext;
    }

    public void InitializeServers()
    {
        foreach(/* server I have in database */)
        {
            ServerStatus s = new ServerStatus(_hubContext, ...);
        }
    }
}

Если вы хотитесоздание экземпляра этого класса при запуске позволяет получить экземпляр в методе Configure.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    var myClass = app.ApplicationServices.GetService<MyClass>();

    myClass.InitializeServers();

    // the rest of the startup
    ...
}

ApplicationServices является реализацией интерфейса IServiceProvider, о котором мы упоминали ранее.

Вызов GetService может осуществляться в любом месте метода Configure.Это не должно идти прямо в начале.

...