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 Windows Forms nie obejmują domyślnie integracji z hostem ogólnym, ale można je dodać. W tym artykule przedstawiono sposób konfigurowania hosta ogólnego w aplikacji Windows Forms w celu wstrzykiwania usług do formularzy.
Wymagania wstępne
-
Microsoft.Extensions.HostingPakiet NuGet.
Konfigurowanie hosta ogólnego
Konfiguracja różni się nieco między językami C# i Visual Basic. W języku C#skonfiguruj hosta bezpośrednio w programie Program.cs. W języku Visual Basic użyj zdarzeń uruchamiania i zamykania struktury aplikacji w programie ApplicationEvents.vb.
Skonfiguruj hosta w Program.cs programie obok elementu ApplicationConfiguration.Initialize():
- Wywołaj metodę
ApplicationConfiguration.Initialize()w celu skonfigurowania domyślnych formularzy WinForms, w tym stylów wizualizacji, trybu wysokiej dpi i czcionek domyślnych. - Zbuduj hosta z CreateApplicationBuilder i zarejestruj usługi.
- Uruchom hosta i rozwiąż formularz główny z di.
- Przekaż formularz do Run.
- Po zamknięciu formularza zatrzymaj i usuń hosta.
Poniższy kod przedstawia pełny kod Program.cs:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace HostBuilderApp;
static class Program
{
[STAThread]
static void Main()
{
ApplicationConfiguration.Initialize();
var builder = Host.CreateApplicationBuilder();
builder.Services.AddHostedService<SampleLifecycleService>();
builder.Services.AddTransient<Form1>();
builder.Services.AddSingleton<IGreetingService, GreetingService>();
IHost host = builder.Build();
host.Start();
Form1 mainForm = host.Services.GetRequiredService<Form1>();
Application.Run(mainForm);
host.StopAsync().GetAwaiter().GetResult();
host.Dispose();
}
}
Rejestrowanie i korzystanie z usług
Po skonfigurowaniu hosta zarejestruj usługi niestandardowe i wprowadź je do formularzy. Aby utworzyć i zarejestrować usługę:
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
GreetingServicewstrzykuje IConfiguration do odczytania wiadomości powitalnej zappsettings.json.public class GreetingService : IGreetingService { private readonly IConfiguration _configuration; public GreetingService(IConfiguration configuration) { _configuration = configuration; } public string GetGreeting() { return _configuration.GetValue<string>("GreetingMessage") ?? "Hello, World!"; } }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 message Is Nothing Then Return "Hello, World!" End If Return message End Function End ClassZarejestruj interfejs i implementację we właściwości buildera
Services, jak pokazano w sekcji Konfigurowanie hosta generycznego.
Uruchamianie hostowanej usługi
Host ogólny może również uruchamiać usługi w tle, które uczestniczą w cyklu życia aplikacji. Zaimplementuj IHostedService, aby odbierać wywołania zwrotne po uruchomieniu i zatrzymaniu hosta. 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ę
AddHostedServicew właściwości projektantaServices, jak pokazano w sekcji Konfigurowanie hosta ogólnego.
Host wywołuje StartAsync na uruchomienie i StopAsync na zamknięcie, więc dane wyjściowe debugowania są wyświetlane w oknie Dane wyjściowe w programie Visual Studio.
Korzystanie z usług w określonej formie
Ponieważ Form1 jest rozpoznawany z kontenera DI, wstrzykiwanie konstruktora działa bezpośrednio:
- Dodaj parametry konstruktora dla każdej usługi, których potrzebuje formularz.
- Przechowuj wprowadzone usługi w polach prywatnych.
- Użyj usług w programach obsługi zdarzeń lub innych metodach.
public partial class Form1 : Form
{
private readonly ILogger<Form1> _logger;
private readonly IGreetingService _greetingService;
public Form1(ILogger<Form1> logger, IGreetingService greetingService)
{
InitializeComponent();
_logger = logger;
_greetingService = greetingService;
}
private void ButtonGreet_Click(object sender, EventArgs e)
{
string greeting = _greetingService.GetGreeting();
lblGreeting.Text = greeting;
_logger.LogInformation("Greeting displayed: {Greeting}", greeting);
}
}
Public Class Form1
Private _logger As ILogger(Of Form1)
Private _greetingService As IGreetingService
Sub New(ILogger As ILogger(Of Form1), greetingService As IGreetingService)
InitializeComponent()
_logger = ILogger
_greetingService = greetingService
End Sub
Private Sub ButtonGreet_Click(sender As Object, e As EventArgs) Handles btnGreet.Click
Dim greeting As String = _greetingService.GetGreeting()
lblGreeting.Text = greeting
_logger.LogInformation("Greeting displayed: {Greeting}", greeting)
End Sub
End Class
Dodawanie konfiguracji
CreateApplicationBuilder automatycznie się ładuje z appsettings.json katalogu wyjściowego. Aby dodać plik konfiguracji:
appsettings.jsonUtwórz plik w katalogu głównym projektu przy użyciu wartości konfiguracji:{ "GreetingMessage": "Hello from the Generic Host!" }Ustaw
CopyToOutputDirectorynaPreserveNewestw pliku projektu, abyappsettings.jsonbył kopiowany do katalogu wyjściowego.<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net10.0-windows</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> <UseWindowsForms>true</UseWindowsForms> </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