1、建立一個接口
public interface IServicesDoParse
{
void Do();
}
2、做一個接口的實作
public class ServicesDoParse : IServicesDoParse
{
private readonly ILogger<IServicesDoParse> _logger;
private readonly MQConfig _mqConfig;
public ServicesDoParse(ILogger<ServicesDoParse> logger, IOptions<MQConfig> settings)
{
_logger = logger;
_mqConfig = settings.Value;
}
public void Do()
{
_logger.LogInformation("ServicesDoParse運作成功,在注入的服務裡讀取IP:", _mqConfig.IP);
}
}
3、在Program的CreateHostBuilder裡添加
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureServices((hostContext, services) =>
{
services.AddScoped<IServicesDoParse, ServicesDoParse>();
services.AddHostedService<Worker>();
services.Configure<MQConfig>(hostContext.Configuration.GetSection(key: "MQ"));
})
.UseSerilog();
4、實際使用
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private readonly MQConfig _mqConfig;
private readonly IServiceProvider _serviceProvider;
public Worker(ILogger<Worker> logger, IOptions<MQConfig> settings, IServiceProvider serviceProvider)
{
_logger = logger;
_mqConfig = settings.Value;
_serviceProvider = serviceProvider;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running at: {time}" + "IP:{1},Port:{2}", DateTimeOffset.Now, _mqConfig.IP, _mqConfig.Port);
using (var scope = _serviceProvider.CreateScope())
{
var service = scope.ServiceProvider.GetRequiredService<IServicesDoParse>();
service.Do();
}
await Task.Delay(1000, stoppingToken);
}
}
}
5、運作結果如下:
