Ответ 1
Вот одно из возможных решений.Реализуйте фабричный шаблон.Создайте фабрику, которая знает, как создать ваш обработчик.Введите IHubContext на заводе.Вы можете использовать несколько подходов таким образом:
- Создайте обработчик, передав IHubContext
- Создайте открытое свойство в обработчике и установите IHubContext
- Createметод в обработчике и передайте IHubContext в качестве параметра
. Вы можете решить, какой подход вам подходит.Вставьте эту фабрику в контроллер через DI и получите обработчик, используя фабричный метод.Таким образом, вы не подвергаете IHubContext.Пожалуйста, смотрите код ниже
public interface IHandlerFactory
{
Handler CreateHandler();
}
public class HandlerFactory : IHandlerFactory
{
private IHubContext _hubContext;
public HandlerFactory(IHubContext context)
{
_hubContext = context;
}
public Handler CreateHandler()
{
return new Handler(param1, param2, _context);
}
}
Затем в точке входа, контроллер / сервис, введите фабрику через DI
public class MyController : Controller
{
private Handler _handler;
public MyController(IHandlerFactory factory)
{
_handler = factory.CreateHandler();
}
}
Затем вы можете использовать этот обработчик _ в других методах.Надеюсь, это поможет.
Ответ 2
Другое возможное решение - использовать IHostedService, если это вообще возможно для вас.Пожалуйста, ознакомьтесь с решением проблемы GitHub , предоставленной Дэвидом Фаулером здесь , которое, я думаю, имеет отношение к вашему сценарию.