Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Host ogólny platformy .NET zapewnia ustandaryzowany sposób konfigurowania i uruchamiania aplikacji z wbudowaną obsługą wstrzykiwania zależności (DI), konfiguracji i rejestrowania. Aplikacje WPF nie obejmują domyślnie integracji z programem Host Builder, ale można je dodać. W tym artykule pokazano, jak skonfigurować hosta ogólnego w aplikacji WPF w celu wstrzykiwania usług do systemu Windows i korzystania z pełnej infrastruktury hostingu .NET.
Wymagania wstępne
-
Microsoft.Extensions.HostingPakiet NuGet.
Konfigurowanie hosta ogólnego
Aby zintegrować host ogólny z aplikacją WPF:
Usuń
StartupUriz pliku XAML aplikacji i podłącz obsługę zdarzeń poprzezStartupiExit.<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>Zbuduj hosta w code-behind.
Metoda
Application_Startuptworzy hosta z użyciem CreateApplicationBuilder, rejestruje usługi we właściwości Services, uruchamia hosta i wyświetla okno główne.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 SubZatrzymaj i zlikwiduj hosta, gdy aplikacja zakończy czyszczenie zasobów:
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
Tworzenie usługi
Właściwość Services w poprzedniej sekcji rejestruje usługi w kontenerze DI. Aby utworzyć usługę niestandardową:
Definiowanie interfejsu usługi:
public interface IGreetingService { string GetGreeting(); }Public Interface IGreetingService Function GetGreeting() As String End InterfaceUtwórz klasę, która implementuje interfejs. Klasa
GreetingServiceakceptuje IConfiguration poprzez wstrzyknięcie do konstruktora, aby odczytywać wartości z klasyappsettings.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
Uruchamianie hostowanej usługi
Host ogólny może również uruchamiać usługi w tle, które uczestniczą w cyklu życia aplikacji. Host wywołuje implementację IHostedService podczas uruchamiania i zatrzymywania. Aby dodać hostowaną usługę:
Utwórz klasę, która implementuje IHostedService. Następująca klasa zapisuje dane wyjściowe debugowania po uruchomieniu i zatrzymaniu hosta:
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 ClassZarejestruj usługę
AddHostedServicewe właściwości builderaServices, jak pokazano wApplication_Startupmetodzie w sekcji Uruchamianie hosta ogólnego.
Host wywołuje StartAsync podczas uruchamiania i StopAsync podczas zatrzymywania, więc dane debugowania pojawiają się w oknie Dane wyjściowe w programie Visual Studio.
Wprowadź usługi do okna
Kontener DI wprowadza zależności do zarejestrowanych okien przez wstrzyknięcie konstruktora. Aby korzystać z usług w oknie, wykonaj następujące kroki:
- Dodaj parametry konstruktora dla każdej usługi, których potrzebuje okno.
- Przechowuj usługi wstrzykiwane w polach prywatnych.
- Użyj usług w programach obsługi zdarzeń lub innych metodach.
Poniższy kod pokazuje, jak MainWindow przyjmuje ILogger<MainWindow> i IGreetingService za pomocą swojego konstruktora.
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
Dodawanie konfiguracji
CreateApplicationBuilder automatycznie ładuje appsettings.json, gdy plik znajduje się w katalogu wyjściowym. Aby dodać plik konfiguracji do projektu:
appsettings.jsonUtwórz plik w katalogu głównym projektu przy użyciu wartości konfiguracji:{ "GreetingMessage": "Hello from the .NET Generic Host!" }Ustaw
CopyToOutputDirectorynaPreserveNewestw pliku projektu, aby plik skopiował się do katalogu wyjściowego:<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>
Treści powiązane
.NET Desktop feedback