Я пытаюсь получить доступ к журналу, созданному рабочей службой в моем веб-приложении. Я сделал тестовое решение:
У меня есть интерфейс 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);
}
}
}
From Startup in мое веб-приложение, я добавляю его как размещенную службу:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddSingleton<WeatherForecastService>();
services.AddHostedService<Worker>();
services.AddTransient<WorkerConsumer>();
}
У меня есть 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: My Program.cs из WorkerService выглядит так:
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();
}
}
}
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>();
}
Сначала я запускаю рабочую службу, затем веб-приложение и получаю:
Насколько я понимаю, рабочая служба регистрируется на хосте, и веб-приложение должно иметь возможность извлекать эту рабочую службу с хоста, это правильно?