Не удается внедрить SignalR IHubContext в класс

#c# #asp.net-core #asp.net-core-signalr

#c# #asp.net-core #asp.net-core-signalr

Вопрос:

Я новичок в использовании SignalR и испытываю проблемы при попытке внедрить IHubContext в класс. Я получаю исключение, как показано ниже, когда пытаюсь запустить код. Он выдает ошибку в строке, где я пытаюсь внедрить TimerEventHandler в startup.cs Вот код:

 public class TimerEventHandler : ITimerEventHandler
    {
        private readonly IConfiguration _config;
        private readonly IHubContext<IndexHub> _hubContext;
    
        public TimerEventHandler(IHubContext<IndexHub> hubContext,
                                 IConfiguration config)
        {
            _hubContext = hubContext;
            _config = config;            
        }
    }
  
  

ITimerEventHandler

 public interface ITimerEventHandler
{
    Task OnTimedEvent(object source, ElapsedEventArgs e, string connectionId);
}
  

И вот код из моего Startup.cs

 public void ConfigureServices(IServiceCollection services)
{            
   services.AddSignalR(o =>
   {
      o.EnableDetailedErrors = true;
   });
   services.AddScoped<ITimerEventHandler, TimerEventHandler>();            
}
  

Код из indexhub

 public class IndexHub : Hub
{       

    private readonly IServiceBusHelper _serviceBusHelper;
    private readonly ITimerEventHandler _timerEventHandler;
    

    public IndexHub(IServiceBusHelper serviceBusHelper,
                  ITimerEventHandler timerEventHandler)
    {
        _serviceBusHelper = serviceBusHelper;
        _timerEventHandler = timerEventHandler;
    }
    ....

}
  

Program.cs

 public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}
  

Исключение, которое я получаю, это:

 > System.AggregateException
  HResult=0x80131500
  Message=Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: my.portal.Hubs.ITimerEventHandler Lifetime: Scoped ImplementationType: my.portal.Hubs.TimerEventHandler': Unable to resolve service for type 'Microsoft.AspNet.SignalR.IHubContext`1[my.portal.Hubs.IndexHub]' while attempting to activate 'my.portal.Hubs.TimerEventHandler'.)
  Source=Microsoft.Extensions.DependencyInjection
  StackTrace:
   at Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(IEnumerable`1 serviceDescriptors, ServiceProviderOptions options)
   at Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions.BuildServiceProvider(IServiceCollection services, ServiceProviderOptions options)
   at Microsoft.Extensions.DependencyInjection.DefaultServiceProviderFactory.CreateServiceProvider(IServiceCollection containerBuilder)
   at Microsoft.Extensions.Hosting.Internal.ServiceFactoryAdapter`1.CreateServiceProvider(Object containerBuilder)
   at Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider()
   at Microsoft.Extensions.Hosting.HostBuilder.Build()
   at my.portal.Program.Main(String[] args) in Program.cs:line 10
  

Может ли кто-нибудь из вас, экспертов, помочь?

Комментарии:

1. Используя предоставленный вами код, я не смог воспроизвести вашу проблему, она хорошо работает в моем проекте. Не могли бы вы поделиться своим ITimerEventHandler и IndexHub . Также из вашего сообщения об ошибке, не могли бы вы поделиться своим Program.cs?

2. @Rena Спасибо, что посмотрели. Я добавил код в соответствии с запросом.

3. Извините, то, что вы предоставляете, не то, что я хочу. Мне нужен ITimerEventHandler и IndexHub . Не IndexHub.js .

4. Извините, @Rena. Теперь я добавил ITimerHandler и IndexHub.

5. Также может хорошо работать в моем проекте. Возможно, некоторые другие вещи влияют на проект. Не могли бы вы, пожалуйста, создать новые репозитории, которые могли бы воспроизвести проблему? И я немного смущен тем, почему вы циклически ссылались на ITimerEventHandler и IndexHub?

Ответ №1:

Итак, я понял это! Я установил Microsoft.AspNet.SignalR.Основной пакет вместо Microsoft.AspNetCore.SignalR.Основной пакет. Спасибо @Rena за то, что посмотрели на это. Только то, что вы заставили меня более внимательно изучить мой код и попытаться разобрать его до основ, помогло мне решить эту проблему.