Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O .NET Generic Host fornece uma forma padronizada de configurar e executar aplicações com suporte incorporado para injeção de dependências (DI), configuração e log. As aplicações WPF não incluem integração com o Host Builder por defeito, mas podes adicioná-la. Este artigo mostra como configurar o Host Genérico numa aplicação WPF para injetar serviços no seu Windows e usar toda a infraestrutura de alojamento .NET.
Pré-requisitos
- O pacote NuGet
Microsoft.Extensions.Hosting.
Configurar o Host Genérico
Para integrar o Host Genérico com a sua aplicação WPF:
Remova
StartupUrido ficheiro XAML da aplicação e associe os handlers de eventosStartupeExit:<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>Constrói o host no code-behind.
O
Application_Startupmétodo cria o host com CreateApplicationBuilder, regista serviços na 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 elimine o host quando a aplicação sai para limpar 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 regista serviços no contentor DI. Para criar um serviço personalizado:
Defina 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 através de injeção no 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
Gerir um serviço alojado
O Host Genérico também pode executar serviços em segundo plano que participam no ciclo de vida da aplicação. O host chama uma IHostedService implementação quando esta começa e termina. Para adicionar um serviço alojado:
Crie uma classe que implemente o IHostedService. A seguinte classe escreve na saída de depuração quando o host inicia e para:
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 ClassRegiste-se o serviço com
AddHostedServicena propriedadeServicesdo construtor, como é mostrado no métodoApplication_Startupna secção Configurar o Host Genérico.
O host chama StartAsync ao iniciar e StopAsync ao parar, por isso o output de depuração aparece na janela Output no Visual Studio.
Injetar serviços numa janela
O contentor DI injeta dependências nas janelas registadas através da injeção de construtores. Para consumir serviços numa 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 seguinte código mostra MainWindow aceitando ILogger<MainWindow> e IGreetingService através do 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 carrega appsettings.json automaticamente quando o ficheiro está no diretório de saída. Para adicionar um ficheiro de configuração ao seu projeto:
Crie um
appsettings.jsonficheiro na raiz do projeto com os seus valores de configuração:{ "GreetingMessage": "Hello from the .NET Generic Host!" }Defina
CopyToOutputDirectoryparaPreserveNewestno ficheiro do projeto para que o ficheiro copie para a pasta 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