Правильное использование .NET Generic Host и IHostApplicationLifetime в приложении .NET 8.0 WPF.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Правильное использование .NET Generic Host и IHostApplicationLifetime в приложении .NET 8.0 WPF.

Сообщение Anonymous »

Я хочу использовать .NET Generic Host в своем приложении .NET 8.0 WPF и использовать IHostApplicationLifetime для некоторых действий по настройке и удалению.
Одно руководство, которое я нашел в Интернете, предлагает следующий подход:

Код: Выделить всё

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();
}
}
Где находится код App.cs:

Код: Выделить всё

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);
}
}
Но, как я вижу, в этом подходе хост приложения используется только как DI. И хост.Start() или хост.StartAsync() не вызывается. Я не могу использовать IHostApplicationLifetime, даже если реализую какую-либо размещенную службу:

Код: Выделить всё

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
}
}
и внедрить его в хост приложения с помощью сервисов.AddHostedService(); Если я добавлю host.Start() перед приложением?.Run() — начинает работать.
Но правильный ли это подход? Или есть другой способ использовать IHostApplicationLifetime в примере кода выше?
ОБНОВЛЕНИЕ: Я также планировал повторно использовать класс MyHostedService в пара консольных приложений (также с помощью .NET Generic Host и ServiceCollection). Я надеюсь, что это будет удобный способ внедрить сервис с одинаковыми действиями по настройке и удалению в разные типы приложений. На самом деле мне просто нужно поймать момент запуска и закрытия wpf и консольных приложений.

Подробнее здесь: https://stackoverflow.com/questions/792 ... et-8-0-wpf
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»