Blazor 服务器应用程序 SignalR ChatHub 依赖注入到 C# 类

问题描述 投票:0回答:0

我正在编写一个 Blazor 网站,它使用 TCP/IP 连接到网络连接设备。 TCP/IP 接口是使用 NuGet 包开发的:SuperSimpleTCP 并且运行良好。该网站是显示通过 TCP/IP 集成检索到的数据的单个页面。当从设备更新 TCP/IP 集成 C# 类时,我需要更新页面。当 TCP/IP 数据发生变化时,我正在尝试使用 SignalR 来提醒 Razor 页面。

在 Blazor Server 示例应用程序中,我更新了演示类:WeatherServiceForecast.cs,为 NavigationManager 使用依赖注入。下面是一段代码:

public class WeatherForecastService
    {

        [Inject]
        NavigationManager? _navManager { get; set; }
        private HubConnection? hubConnection;
        public WeatherForecastService()
        {
            StartNav();
        }

        public async void StartNav()
        {
            hubConnection = new HubConnectionBuilder()
                      .WithUrl(_navManager.ToAbsoluteUri("/chathub"))
            .Build();

            await hubConnection.StartAsync();

        }

在 Program.cs 中,我试图通过将服务添加到容器来实例化类 WeatherForcastService:

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddSingleton<WeatherForecastService>(); 
var _weatherForecast = config.Get<WeatherForecastService>();
//WeatherForecastService instantiated here, but NavigationManager is still null.


var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseStaticFiles();

app.UseRouting();

app.MapBlazorHub();
app.MapHub<ChatHub>("/chathub"); //NavManager is instantiated here, but WeatherServiceForecast is already instantiated.
//I need to get the _navigationManager here!
var _navigationManager = config.Get<NavigationManager>(); //Unfortunately, this throws an abstract type error!
//If I had the value of _navigationManager I can then set _navManager in WeatherServiceForecast:
_weatherForecastService.NavigationManager(_navigationManager);
app.MapFallbackToPage("/_Host");

在上面的代码中,我正在创建 NavigationManager 的实例,当行:

app.MapHub<ChatHub>("/chathub"); 

被执行。

在我的 Razor 页面后面的代码中,我有一个用于 NavigationManager 的注入构造函数:

using BlazorApp8.Data;
using Microsoft.AspNetCore.SignalR.Client;

namespace BlazorApp8.Pages
{
    public partial class FetchData
    {
        private WeatherForecast[]? forecasts;
        int foo;

        NavigationManager? _navManager { get; set; }
        private HubConnection? hubConnection;
        protected override async Task OnInitializedAsync()
        {
            forecasts = await ForecastService.GetForecastAsync(DateOnly.FromDateTime(DateTime.Now));
            StartNav();
        }

        public async void StartNav()
        {
            hubConnection = new HubConnectionBuilder()
                      .WithUrl(_navManager.ToAbsoluteUri("/chathub"))
            .Build();

            await hubConnection.StartAsync();

        }
    }
}

但是,当我在 WeatherServiceForecast 中使用相同的代码时,_navManager 对象为空。我相信这是因为在创建 HubChat 之前实例化了 WeatherServiceForecast,因此 NavigationManager 仍然为空。

有没有办法在 Program.cs 中检索 NavigationManager,然后我可以在我的 WeatherServiceForecast 类中自己设置它? (实际上在我真正的 TCP/IP 接口类中)。或者,有没有办法等到 HubChat 实例化后才创建 WeatherServiceForecast 实例?

c# blazor signalr
© www.soinside.com 2019 - 2024. All rights reserved.