Вам нужно ввести IServiceProvider
в ваш Hub
с помощью. NET Core DI (как в стандартный контроллер, ввод с помощью конструктора):
public class MoveViewHub : Hub
{
private readonly IServiceProvider provider
public MovieViewHub(IServiceProvider provider)
{
this.provider = provider
}
}
Затем вы можете сделать что-то вроде этого:
public override Task OnConnectedAsync()
{
Console.WriteLine("Client has connected");
// you need to inject service provider to your hub, then get hub context from
// registered services
using (var scope = this.provider.CreateScope())
{
// get instance of hub from service provider
var scopedServices = scope.ServiceProvider;
var hub = scopedServices.GetRequiredService<IHubContext<MoveViewHub>>
// pass hub to class constructor
RfidClass rfidClass = new RfidClass(hub)
rfidClass.sas();
RfidClass.SendTagNumber += ReceiveTagNumber;
}
System.Diagnostics.Process.Start(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), "Notepad++", @"notepad++.exe"));
return base.OnConnectedAsync();
}
РЕДАКТИРОВАТЬ:
Если вы просто хотите SignalR
работать, вам не нужно работать на Hub
. Вместо этого сделайте сервис. В этом сервисе введите HubContext<>
вашего Hub
:
// you need to make your own class and interface and inject hub context
public interface ISignalRService
{
Task SendMessageToAll(string message);
}
public class SignalRService : ISignalRService
{
private readonly IHubContext<YourHub> hubContext;
public SignalRService (IHubContext<NotificationHub> hubContext)
{
this.hubContext = hubContext;
}
public async Task SendMessageToAll(string message)
{
await this.hubContext.Clients.All.SendAsync("ReciveMessage", message);
}
}
Затем зарегистрируйте этот сервис в вашем Startup
классе:
services.AddScoped<ISignalRService, SignalRService>();
После этого вы сможете позвонить SignalRService
Везде, где вы хотите, чтобы нормальный сервис из контейнера .NetCore DI:
private readonly ISignalRService notificationService;
public SomeController(ISignalRService notificationService)
{
this.notificationService = notificationService;
}
[HttpGet]
public async Task<IActionResult> Send()
{
await this.notificationService.SendMessageToAll("message");
return Ok();
}
Вам не нужно немного работать, как RfidClass
.