asp.net-core - 如何在 Web 应用程序中使用已经运行的 .Net Core WorkerService?
问题描述
我正在尝试访问由我的网络应用程序中的工作服务生成的日志。我做了一个测试解决方案:
我有一个 ILogGenerator 接口来生成日志和一个实现它的工作人员:
public interface ILogGenerator
{
event EventHandler<string> LogGenerated;
}
public class Worker : BackgroundService, ILogGenerator
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
public event EventHandler<string> LogGenerated;
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
var log = $"Worker running at: {DateTimeOffset.Now} {new Guid()}";
LogGenerated?.Invoke(this, log);
_logger.LogInformation(log);
await Task.Delay(10000, stoppingToken);
}
}
}
从我的网络应用程序的启动中,我将其添加为托管服务:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddSingleton<WeatherForecastService>();
services.AddHostedService<Worker>();
services.AddTransient<WorkerConsumer>();
}
我有一个工人消费者,我想将日志打印到控制台:
public class WorkerConsumer
{
public WorkerConsumer(ILogGenerator worker)
{
worker.LogGenerated += Worker_LogGenerated;
}
private void Worker_LogGenerated(object sender, string e)
{
Debug.WriteLine(e);
}
}
如果我不调用工人消费者,它可以工作,但我会创建两个 WorkerService1。
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddSingleton<WeatherForecastService>();
services.AddHostedService<Worker>();
//services.AddSingleton<WorkerConsumer>();
}
如果我不添加工作服务来启动,并且我在索引页面中注入工作消费者,它可以工作,但是工作服务不再作为单独的控制台应用程序运行。
更新 1:我的 WorkerService 的 Program.cs 看起来像:
namespace WorkerService1
{
public class Program
{
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
// services.AddTransient<ILogGenerator>(l => l.GetRequiredService<Worker>());
});
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
}
}
我的 Web 应用程序的 Startup.cs ConfigureServices 如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
// services.AddHostedService<Worker>();
services.AddTransient<ILogGenerator>(l => l.GetRequiredService<Worker>());
services.AddTransient<WorkerConsumer>();
}
我的理解是工作服务已注册到主机,并且网络应用程序应该能够从主机中提取该工作服务,对吗?
解决方案
根据您的错误消息,您遇到了依赖注入问题。
这可能是因为您忘记在 IServiceCollection 中注册 ILogGenerator 接口及其各自的实现。
问候,
推荐阅读
- php - 用于访问数组的 PHP 空安全运算符
- paypal - Paypal API/协议页面/隐藏收货地址块
- powerbi - Power BI - 使用多个按钮创建多个书签
- dump - 使用 marshmallow.fields 和性能转储用户数据
- postgresql - 在 postgresql 的原始文本列中使用多种日期格式转换列 to_date
- pdf - 自动将特定发件人的 pdf 附件(类型 application/pdf)保存到另一个 pdf 类型的附件(/A 或 /X pdf 类型
- android - React native mqtt - 按下按钮时发布
- python - 在 Django 中,如何为 IntegerChoices 枚举定义字符串值?
- matlab - 如何根据“x”值绘制具有不同方程的图形
- cypress - Cypress-File-Upload 插件的替代品