我正在编写一个 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 实例?