Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O Host Genérico do .NET fornece uma maneira padronizada de configurar e executar aplicativos com suporte interno para DI (injeção de dependência), configuração e registro em log. Os aplicativos WPF não incluem a integração do Construtor de Host por padrão, mas você pode adicioná-la. Este artigo mostra como configurar o Host Genérico em um aplicativo WPF para injetar serviços em suas janelas e usar a infraestrutura de hospedagem completa do .NET.
Pré-requisitos
- O
Microsoft.Extensions.Hostingpacote NuGet.
Configurar o host genérico
Para integrar o Host Genérico ao seu aplicativo WPF:
Remova
StartupUrido arquivo XAML do aplicativo e conecte osStartupmanipuladores de eventos eExit:<Application x:Class="HostBuilderApp.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Startup="Application_Startup" Exit="Application_Exit"> <Application.Resources> </Application.Resources> </Application>Crie o host no code-behind.
O método
Application_Startupcria o host com CreateApplicationBuilder, registra serviços no Services propriedade, inicia o host e mostra a janela principal.private async void Application_Startup(object sender, StartupEventArgs e) { var builder = Host.CreateApplicationBuilder(); builder.Services.AddHostedService<SampleLifecycleService>(); builder.Services.AddSingleton<IGreetingService, GreetingService>(); builder.Services.AddSingleton<MainWindow>(); _host = builder.Build(); await _host.StartAsync(); MainWindow mainWindow = _host.Services.GetRequiredService<MainWindow>(); mainWindow.Show(); }Private Async Sub Application_Startup(sender As Object, e As StartupEventArgs) Dim builder = Host.CreateApplicationBuilder() builder.Services.AddHostedService(Of SampleLifecycleService)() builder.Services.AddSingleton(Of IGreetingService, GreetingService)() builder.Services.AddSingleton(Of MainWindow)() _host = builder.Build() Await _host.StartAsync() Dim mainWindow As MainWindow = _host.Services.GetRequiredService(Of MainWindow)() mainWindow.Show() End SubPare e descarte o host quando o aplicativo for encerrado para liberar os recursos.
private async void Application_Exit(object sender, ExitEventArgs e) { using (_host) { await _host.StopAsync(); } }Private Async Sub Application_Exit(sender As Object, e As ExitEventArgs) Using _host Await _host.StopAsync() End Using End Sub
Criar um serviço
A Services propriedade na seção anterior registra serviços no contêiner de DI. Para criar um serviço personalizado:
Definir uma interface de serviço:
public interface IGreetingService { string GetGreeting(); }Public Interface IGreetingService Function GetGreeting() As String End InterfaceCrie uma classe que implemente a interface. A
GreetingServiceclasse aceita IConfiguration por meio de injeção de construtor para ler valores deappsettings.json:public class GreetingService(IConfiguration configuration) : IGreetingService { public string GetGreeting() => configuration.GetValue<string>("GreetingMessage") ?? "Hello from the Generic Host!"; }Public Class GreetingService Implements IGreetingService Private ReadOnly _configuration As IConfiguration Public Sub New(configuration As IConfiguration) _configuration = configuration End Sub Public Function GetGreeting() As String Implements IGreetingService.GetGreeting Dim message As String = _configuration.GetValue(Of String)("GreetingMessage") If String.IsNullOrEmpty(message) Then Return "Hello from the Generic Host!" End If Return message End Function End Class
Executar um serviço hospedado
O Host Genérico também pode executar serviços em segundo plano que participam do ciclo de vida do aplicativo. O host chama uma implementação IHostedService quando inicia e para. Para adicionar um serviço hospedado:
Crie uma classe que implementa IHostedService. A classe a seguir grava na saída de depuração quando o host é iniciado e parado.
public class SampleLifecycleService : IHostedService { public Task StartAsync(CancellationToken cancellationToken) { System.Diagnostics.Debug.WriteLine("SampleLifecycleService: Started."); return Task.CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) { System.Diagnostics.Debug.WriteLine("SampleLifecycleService: Stopped."); return Task.CompletedTask; } }Public Class SampleLifecycleService Implements IHostedService Public Function StartAsync(cancellationToken As CancellationToken) As Task Implements IHostedService.StartAsync System.Diagnostics.Debug.WriteLine("SampleLifecycleService: Started.") Return Task.CompletedTask End Function Public Function StopAsync(cancellationToken As CancellationToken) As Task Implements IHostedService.StopAsync System.Diagnostics.Debug.WriteLine("SampleLifecycleService: Stopped.") Return Task.CompletedTask End Function End ClassRegistre o serviço na
AddHostedServicepropriedade doServicesconstrutor, conforme mostrado noApplication_Startupmétodo na seção Configurar o Host Genérico .
O host chama StartAsync ao iniciar e StopAsync ao parar, de modo que a saída de depuração apareça na janela Saída no Visual Studio.
Injetar serviços em uma janela
O contêiner de DI injeta dependências em janelas registradas por meio de injeção de construtor. Para acessar serviços em uma janela:
- Adicione parâmetros de construtor para cada serviço de que a janela precisa.
- Armazene os serviços injetados em campos privados.
- Utilize os serviços em manipuladores de eventos ou outros métodos.
O código a seguir mostra MainWindow aceitando ILogger<MainWindow> e IGreetingService através de seu construtor.
public partial class MainWindow : Window
{
private readonly ILogger<MainWindow> _logger;
private readonly IGreetingService _greetingService;
public MainWindow(ILogger<MainWindow> logger, IGreetingService greetingService)
{
InitializeComponent();
_logger = logger;
_greetingService = greetingService;
}
private void OnGetGreetingClick(object sender, RoutedEventArgs e)
{
_logger.LogInformation("Get Greeting button clicked.");
GreetingText.Text = _greetingService.GetGreeting();
}
}
Class MainWindow
Private ReadOnly _logger As ILogger(Of MainWindow)
Private ReadOnly _greetingService As IGreetingService
Public Sub New(logger As ILogger(Of MainWindow), greetingService As IGreetingService)
InitializeComponent()
_logger = logger
_greetingService = greetingService
End Sub
Private Sub OnGetGreetingClick(sender As Object, e As RoutedEventArgs)
_logger.LogInformation("Get Greeting button clicked.")
GreetingText.Text = _greetingService.GetGreeting()
End Sub
End Class
Adicionar configuração
CreateApplicationBuilder é carregado appsettings.json automaticamente quando o arquivo está no diretório de saída. Para adicionar um arquivo de configuração ao seu projeto:
Crie um
appsettings.jsonarquivo na raiz do projeto com seus valores de configuração:{ "GreetingMessage": "Hello from the .NET Generic Host!" }Defina
CopyToOutputDirectorycomoPreserveNewestno arquivo de projeto para que o arquivo seja copiado para o diretório de saída:<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net10.0-windows</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> <UseWPF>true</UseWPF> </PropertyGroup> <ItemGroup> <None Update="appsettings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup> <ItemGroup> <PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.*" /> </ItemGroup> </Project>
Conteúdo relacionado
.NET Desktop feedback