Получите HubContext извне Hub с помощью библиотеки Aspnetcore.signalr (не из контроллера)

Я разрабатываю службу SignalR с использованием AspNetCore.SignalR.

Ниже мой хаб:

public class NotificationHub : Microsoft.AspNetCore.SignalR.Hub
    {
        public override async Task OnConnectedAsync()
        {
            await base.OnConnectedAsync();
        }

        public override async Task OnDisconnectedAsync(Exception exception)
        {
            await base.OnDisconnectedAsync(exception);
        }
    }

Ниже приведен еще один класс контекста, который я создал для вызова метода Hub на стороне клиента:

public class NotificationHubContext
    {
        private readonly IHubContext<NotificationHub> _context;

        public NotificationHubContext(IHubContext<NotificationHub> context)
        {
            _context = context;
        }

        public async Task Broadcast(string groupId, string eventName, object data)
        {
            await _context.Clients.Group(groupId).SendAsync(eventName, data);
        }
    }

Я хотел бы внедрить ссылку на класс NotificationContext в свой собственный контейнер IoC, чтобы я мог просто разрешить его и вызвать для него метод BroadCast, и он должен обрабатывать отправку сообщений клиентам.

Я использую служебную шину для прослушивания сообщений из другой части системы. Как только я получаю сообщение из очереди, я хочу уведомить подключенных клиентов с помощью HubContext из QueueHandler.

Информация о сборке


person Sagar    schedule 30.05.2018    source источник
comment
Я считаю, что это ответ на ваш вопрос stackoverflow.com/questions/27299289/   -  person iNovelletto    schedule 30.05.2018
comment
@iNovelletto Я пытаюсь использовать HubContext без использования контроллера.   -  person Sagar    schedule 30.05.2018
comment
Извините, тогда, вероятно, это решит вашу проблему: stackoverflow.com/questions/37318209/   -  person iNovelletto    schedule 30.05.2018
comment
Какой контейнер IoC вы используете и как вы его зарегистрировали?   -  person aaron    schedule 31.05.2018


Ответы (2)


var hubContext = app.ApplicationServices.GetService<IHubContext<Notification>>

Это решило мою проблему.

person Sagar    schedule 01.06.2018

Я создаю свой класс, как показано ниже.

public class NotificationHub : Microsoft.AspNetCore.SignalR.Hub
{
    public static IHubContext<NotificationHub> Current { get; set; }
}

В вашем классе Startup

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    NotificationHub.Current = app.ApplicationServices.GetService<IHubContext<NotificationFromServerHub>>();

}

Таким образом, вы можете использовать его откуда угодно.

public class MyBizClass
{
    public void DoSomething()
    {
        NotificationHub.Current.MyMethod(...);
    }
}
person Higty    schedule 14.04.2020