Как получить и вставить IHostApplicationLifetime в моем сервисе в контейнер (Консольное приложение) - PullRequest
1 голос
/ 08 января 2020

После этого ответа я хочу, чтобы IHostApplicationLifetime в моем классе правильно отключился, когда метод StartAsync закончился.

Но я не знаю, как это сделать получите applicationLifetime из консоли и введите его через встроенный контейнер do tnet core Io C:

public static IHostBuilder CreateHostBuilder(string[] args)
{
    return Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.SetBasePath(Directory.GetCurrentDirectory())
            .AddCommandLine(args)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
        })
        .ConfigureServices((hostContext, services) =>
        {
            services.Configure<ConnectionStringConfiguration>(hostContext.Configuration.GetSection("ConnectionStrings"));
            services.AddTransient<ISmtpClient, MySmtpClient>();
            services.AddTransient<IEmailService, EmailService>();
            services.AddSingleton<IHostApplicationLifetime>(????); // What should I put here ????
            services.AddHostedService<EInvoiceSenderService>();
        })
        .UseSerilog();
}

Спасибо!

1 Ответ

1 голос
/ 08 января 2020

Он уже добавлен по умолчанию фреймворком, поэтому вы сможете получить к нему доступ из размещенной службы.

Упрощенный пример

public class EInvoiceSenderService: IHostedService {
    private readonly ILogger logger;
    private readonly IHostApplicationLifetime appLifetime;

    public EInvoiceSenderService(
        ILogger<LifetimeEventsHostedService> logger, 
        IHostApplicationLifetime appLifetime) {
        this.logger = logger;
        this.appLifetime = appLifetime;
    }

    public Task StartAsync(CancellationToken cancellationToken) {
        appLifetime.ApplicationStarted.Register(OnStarted);
        appLifetime.ApplicationStopping.Register(OnStopping);
        appLifetime.ApplicationStopped.Register(OnStopped);

        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken) {
        return Task.CompletedTask;
    }


    private void OnStarted() {
        logger.LogInformation("OnStarted has been called.");

        // Perform post-startup activities here
    }

    private void OnStopping() {
        logger.LogInformation("OnStopping has been called.");

        // Perform on-stopping activities here
    }

    private void OnStopped() {
        logger.LogInformation("OnStopped has been called.");

        // Perform post-stopped activities here
    }    
}

Ссылка . NET Generi c Хост: IHostApplicationLifetime

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...