Получение HubContext как ноль в .NET Core - PullRequest
0 голосов
/ 20 мая 2019

Я работаю с основным приложением .NET, используя SignalR. Мой код класса концентратора:

public class LiveDataHub : Hub
{
    public async Task GetUpdatedDataFromServer()
    {
        try
        {
            var dal = new DAL();
            var dashboardVM = dal.GetDashboardViewModels();

            Clients.Caller.SendAsync("UpdatePortalWithUpdatedData", dashboardVM);
        }
        catch(Exception ex)
        {

        }
    }
}

Мой код Startup.cs:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseSignalR(routes =>
        {
            routes.MapHub<LiveDataHub>("/LiveDataHub");
        });
}

У меня есть другой класс "ModuleLoader", код которого:

public class ModuleLoader
{
    GlobalCache _globalCache = GlobalCache.GetInstance();
    private readonly IHubContext<LiveDataHub> _hubContext;
    public ModuleLoader()
    {

    }

    public ModuleLoader(IHubContext<LiveDataHub> hubContext)
    {
        _hubContext = hubContext;
    }

    private void OnAdapterGroupDataReceived(DeviceAdapterGroup deviceAdapterGroup)
    {
        var dal = new DAL();
        dal.InsertOrUpdateAllAdapters(deviceAdapterGroup.AdapterGroup);

        if(deviceAdapterGroup != null)
        {
            dal.InsertAllDeviceAdapter(deviceAdapterGroup);
        }

        var allAdapters = dal.GetAllAdaptersConnectedToDevice(deviceAdapterGroup.DeviceId);
        var adaptersToDelete = allAdapters.Except(deviceAdapterGroup.AdapterGroup.Select(x => x.AdapterId)).ToList();
        if (adaptersToDelete != null && adaptersToDelete.Count > 0)
            dal.DeleteAllAdapters(adaptersToDelete);

        var dashboardVM = dal.GetDashboardViewModels();

        _hubContext.Clients.All.SendAsync("UpdatePortalWithUpdatedData", dashboardVM);

    }
}

Проблема в том, что когда я запускаю этот код, я получаю исключение, что _hubContext имеет значение null. Как я могу решить это. Любая помощь будет высоко ценится

1 Ответ

1 голос
/ 20 мая 2019

Вам также может понадобиться добавить класс ModuleLoader в контейнер DI, если вы этого еще не сделали.Вы можете использовать контейнер .net core по умолчанию, как показано ниже:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR();
    services.AddScoped<ModuleLoader>();
} 
...