Одно руководство, которое я нашел в Интернете, предлагает следующий подход:
Код: Выделить всё
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using System;
public class Program
{
[STAThread]
public static void Main()
{
// creating application host
var host = Host.CreateDefaultBuilder()
// injecting services
.ConfigureServices(services =>
{
services.AddSingleton();
services.AddSingleton();
})
.Build();
// getting a service - App class object
var app = host.Services.GetService();
// starting application
app?.Run();
}
}
Код: Выделить всё
using System.Windows;
public class App : Application
{
readonly MainWindow mainWindow;
// getting main windows object via DI
public App(MainWindow mainWindow)
{
this.mainWindow = mainWindow;
}
protected override void OnStartup(StartupEventArgs e)
{
mainWindow.Show(); // displaying main window
base.OnStartup(e);
}
}
Код: Выделить всё
public class MyHostedService : IHostedService
{
public MyHostedService(IHostApplicationLifetime appLifetime)
{
appLifetime.ApplicationStarted.Register(OnStarted);
appLifetime.ApplicationStopping.Register(OnStopping);
}
public Task StartAsync(CancellationToken cancellationToken) => Task.CompletedTask;
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
private void OnStarted()
{
//my custom setup actions here
}
private void OnStopping()
{
//my custom teardown actions here
}
}
Но правильный ли это подход? Или есть другой способ использовать IHostApplicationLifetime в примере кода выше?
ОБНОВЛЕНИЕ: Я также планировал повторно использовать класс MyHostedService в пара консольных приложений (также с помощью .NET Generic Host и ServiceCollection). Я надеюсь, что это будет удобный способ внедрить сервис с одинаковыми действиями по настройке и удалению в разные типы приложений. На самом деле мне просто нужно поймать момент запуска и закрытия wpf и консольных приложений.
Подробнее здесь: https://stackoverflow.com/questions/792 ... et-8-0-wpf