2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Tämä artikkeli käyttää WPF-galleriaprojektia oppiakseen riippuvuuden lisäyksen käsitteet ja kuinka suorittaa riippuvuuslisäys WPF:ssä.
Dependency Injection (DI) on suunnittelumalli, jota käytetään ohjauksen käänteisperiaatteen (IoC) toteuttamiseen. Riippuvuusinjektion päätarkoitus on siirtää objektien luominen ja objektien välisten riippuvuuksien hallinta objektin sisältä ulkoiseen säilöön tai kehyksiin, mikä parantaa koodin ylläpidettävyyttä, testattavuutta ja joustavuutta.
Riippuvuusruiskeen ydinkäsite
Riippuvuusruiskeen tyypit
rakentajan ruiskutus: Riippuva objekti välitetään luokan rakentajan kautta.
public class OrderService
{
private readonly IProductRepository _productRepository;
public OrderService(IProductRepository productRepository)
{
_productRepository = productRepository;
}
}
Kiinteistöinjektio: Riippuvat objektit välitetään luokan julkisten ominaisuuksien kautta.
public class OrderService
{
public IProductRepository ProductRepository { get; set; }
}
menetelmä injektio: Riippuvainen objekti välitetään luokan metodiparametrin läpi.
public class OrderService
{
public void ProcessOrder(IProductRepository productRepository)
{
// 使用 productRepository 处理订单
}
}
Dependency Injection (DI) on suunnittelumalli, jonka avulla objektien luominen ja objektien välisten riippuvuuksien hallinta voidaan siirtää objektin sisältä ulkoiseen säilöön tai kehykseen. Riippuvuusinjektiolle on useita tärkeitä syitä ja etuja:
Tämä artikkeli käyttää WPF-galleriaprojektia oppiakseen käyttämään riippuvuuslisäystä WPF-koodiosoitteessa:
https://github.com/microsoft/WPF-Samples/blob/main/SampleApplications/WPFGallery
Riippuvuuslisäyksen toteuttamiseksi tässä projektissa käytetään näitä kahta pakettia:
Katso ensin App.xaml.cs:n sisältö:
public partial class App : Application
{
private static readonly IHost _host = Host.CreateDefaultBuilder()
.ConfigureServices((context, services) =>
{
services.AddSingleton<INavigationService, NavigationService>();
services.AddSingleton<MainWindow>();
services.AddSingleton<MainWindowViewModel>();
services.AddTransient<DashboardPage>();
services.AddTransient<DashboardPageViewModel>();
services.AddTransient<ButtonPage>();
services.AddTransient<ButtonPageViewModel>();
services.AddTransient<CheckBoxPage>();
services.AddTransient<CheckBoxPageViewModel>();
services.AddTransient<ComboBoxPage>();
services.AddTransient<ComboBoxPageViewModel>();
services.AddTransient<RadioButtonPage>();
services.AddTransient<RadioButtonPageViewModel>();
services.AddTransient<SliderPage>();
services.AddTransient<SliderPageViewModel>();
services.AddTransient<CalendarPage>();
services.AddTransient<CalendarPageViewModel>();
services.AddTransient<DatePickerPage>();
services.AddTransient<DatePickerPageViewModel>();
services.AddTransient<TabControlPage>();
services.AddTransient<TabControlPageViewModel>();
services.AddTransient<ProgressBarPage>();
services.AddTransient<ProgressBarPageViewModel>();
services.AddTransient<MenuPage>();
services.AddTransient<MenuPageViewModel>();
services.AddTransient<ToolTipPage>();
services.AddTransient<ToolTipPageViewModel>();
services.AddTransient<CanvasPage>();
services.AddTransient<CanvasPageViewModel>();
services.AddTransient<ExpanderPage>();
services.AddTransient<ExpanderPageViewModel>();
services.AddTransient<ImagePage>();
services.AddTransient<ImagePageViewModel>();
services.AddTransient<DataGridPage>();
services.AddTransient<DataGridPageViewModel>();
services.AddTransient<ListBoxPage>();
services.AddTransient<ListBoxPageViewModel>();
services.AddTransient<ListViewPage>();
services.AddTransient<ListViewPageViewModel>();
services.AddTransient<TreeViewPage>();
services.AddTransient<TreeViewPageViewModel>();
services.AddTransient<LabelPage>();
services.AddTransient<LabelPageViewModel>();
services.AddTransient<TextBoxPage>();
services.AddTransient<TextBoxPageViewModel>();
services.AddTransient<TextBlockPage>();
services.AddTransient<TextBlockPageViewModel>();
services.AddTransient<RichTextEditPage>();
services.AddTransient<RichTextEditPageViewModel>();
services.AddTransient<PasswordBoxPage>();
services.AddTransient<PasswordBoxPageViewModel>();
services.AddTransient<ColorsPage>();
services.AddTransient<ColorsPageViewModel>();
services.AddTransient<LayoutPage>();
services.AddTransient<LayoutPageViewModel>();
services.AddTransient<AllSamplesPage>();
services.AddTransient<AllSamplesPageViewModel>();
services.AddTransient<BasicInputPage>();
services.AddTransient<BasicInputPageViewModel>();
services.AddTransient<CollectionsPage>();
services.AddTransient<CollectionsPageViewModel>();
services.AddTransient<MediaPage>();
services.AddTransient<MediaPageViewModel>();
services.AddTransient<NavigationPage>();
services.AddTransient<NavigationPageViewModel>();
services.AddTransient<TextPage>();
services.AddTransient<TextPageViewModel>();
services.AddTransient<DateAndTimePage>();
services.AddTransient<DateAndTimePageViewModel>();
services.AddTransient<StatusAndInfoPage>();
services.AddTransient<StatusAndInfoPageViewModel>();
services.AddTransient<SamplesPage>();
services.AddTransient<SamplesPageViewModel>();
services.AddTransient<DesignGuidancePage>();
services.AddTransient<DesignGuidancePageViewModel>();
services.AddTransient<UserDashboardPage>();
services.AddTransient<UserDashboardPageViewModel>();
services.AddTransient<TypographyPage>();
services.AddTransient<TypographyPageViewModel>();
services.AddSingleton<IconsPage>();
services.AddSingleton<IconsPageViewModel>();
services.AddSingleton<SettingsPage>();
services.AddSingleton<SettingsPageViewModel>();
services.AddSingleton<AboutPage>();
services.AddSingleton<AboutPageViewModel>();
}).Build();
[STAThread]
public static void Main()
{
_host.Start();
App app = new();
app.InitializeComponent();
app.MainWindow = _host.Services.GetRequiredService<MainWindow>();
app.MainWindow.Visibility = Visibility.Visible;
app.Run();
}
}
Mikä on IHost?
C#:ssa,IHost
on käyttöliittymä, jota käytetään .NET:ssä sovellusten rakentamiseen ja konfigurointiinHost
käsite abstrakti.IHost
Käyttöliittymä määrittelee joukon palveluita ja komponentteja, joita tarvitaan sovelluksen käynnistämiseen, suorittamiseen ja hallintaan. Sitä käytetään yleensä ASP.NET Core -sovellusten kanssa, mutta se toimii myös muun tyyppisten .NET-sovellusten, kuten konsolisovellusten tai WPF-ohjelmien, kanssa.
IHost
Käyttöliittymä koostuuHostBuilder
Luokan toteutus, joka tarjoaa luomisen ja konfiguroinninIHost
esimerkkimenetelmiä.HostBuilder
Voit lisätä erilaisia palveluita, kuten kirjaamisen, määrityksen, riippuvuuden lisäyssäiliöt jne., ja määrittää sovelluksesi käynnistys- ja pysäytyskäyttäytymisen.
Tarjoaa käteviä menetelmiä Microsoft.Extensions.Hosting.IHostBuilder-esiintymien luomiseen ennalta määritetyillä oletusarvoilla.
Palauttaa IHostBuilderin.
Lisää palveluita säilöön. Tätä toimintoa voidaan kutsua useita kertoja ja sen tulokset ovat kumulatiivisia.
Parametrin configureDelegate tarkoitus on määrittää Microsoft.Extensions.DependencyInjection.IServiceCollectionin delegaatti.
Tätä kokoelmaa käytetään System.IServiceProviderin rakentamiseen.
Valtuutettu vaatii kaksi parametrityyppiä: HostBuilderContext ja IServiceCollection, joilla ei ole palautusarvoa.
Lambda-lauseke, joka täyttää delegaatin tyypin, välitetään tähän.
C#:ssa,() => {}
On syntaksi lambda-lausekkeille. Lambda-lausekkeet ovat kevyt delegaatin kääre, jonka avulla voit määrittää anonyymin menetelmän ja välittää sen parametrina menetelmälle, joka tukee delegaatteja tai lausekepuita.
Lambda-lausekkeet tarjoavat tiiviin tavan määrittää menetelmiä, ja ne ovat hyödyllisiä erityisesti silloin, kun menetelmiä on välitettävä parametreina muille menetelmille.
Palveluita lisättäessä tässä on kaksi elinkaaria, AddSingletonin ja AddTransientin lisäksi mukana on myös AddScoped.
Nämä menetelmät määrittävät palvelun elinkaaren eli kuinka palveluesiintymiä luodaan ja hallitaan sovelluksessa.
AddSingleton
AddTransient
AddScoped
käyttää näitä palveluita
Päätoiminnossa:
aloittaa_host
,kulkea_host.Services.GetRequiredService<MainWindow>();
Hanki MainWindow-instanssi.
Esimerkkinä MainWindow-luokan katsotaan MainWindow-konstruktoria MainWindow.xaml.cs-tiedostossa:
public MainWindow(MainWindowViewModel viewModel, IServiceProvider serviceProvider, INavigationService navigationService)
{
_serviceProvider = serviceProvider;
ViewModel = viewModel;
DataContext = this;
InitializeComponent();
Toggle_TitleButtonVisibility();
_navigationService = navigationService;
_navigationService.Navigating += OnNavigating;
_navigationService.SetFrame(this.RootContentFrame);
_navigationService.Navigate(typeof(DashboardPage));
WindowChrome.SetWindowChrome(
this,
new WindowChrome
{
CaptionHeight = 50,
CornerRadius = default,
GlassFrameThickness = new Thickness(-1),
ResizeBorderThickness = ResizeMode == ResizeMode.NoResize ? default : new Thickness(4),
UseAeroCaptionButtons = true
}
);
this.StateChanged += MainWindow_StateChanged;
}
Aiheeseen liittymättömän sisällön poistamisen jälkeen tilanne on seuraava:
public MainWindow(MainWindowViewModel viewModel, IServiceProvider serviceProvider, INavigationService navigationService)
{
_serviceProvider = serviceProvider;
ViewModel = viewModel;
_navigationService = navigationService;
}
Oletko huomannut, että näitä objekteja ei enää tarvitse itse luoda.
Jos riippuvuusinjektiota ei käytetä, se voi näyttää tältä:
public MainWindow()
{
_serviceProvider = new IServiceProvider();
ViewModel = new MainWindowViewModel();
_navigationService = new INavigationService();
}
Tässä artikkelissa esitellään ensin riippuvuuslisäyksen käsite, sitten selitetään, miksi riippuvuuslisäystä tarvitaan, ja lopuksi opitaan käyttämään riippuvuuden lisäystä WPF:ssä WPF Gallery -projektin kautta.
1、[WPF-Samples/Sample Applications/WPFGallery pääsivulla · microsoft/WPF-Samples (github.com)](https://github.com/microsoft/WPF-Samples/tree/main/Sample Applications/WPFGallery)