τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Αυτό το άρθρο χρησιμοποιεί το έργο WPF Gallery για να μάθει τις σχετικές έννοιες της ένεσης εξάρτησης και τον τρόπο εκτέλεσης της ένεσης εξάρτησης στο WPF.
Το Dependency Injection (DI) είναι ένα μοτίβο σχεδιασμού που χρησιμοποιείται για την εφαρμογή της αρχής Inversion of Control (IoC). Ο κύριος σκοπός της ένεσης εξάρτησης είναι να μεταφέρει τη δημιουργία αντικειμένων και τη διαχείριση των εξαρτήσεων μεταξύ αντικειμένων από το εσωτερικό του αντικειμένου σε ένα εξωτερικό δοχείο ή πλαίσιο, βελτιώνοντας έτσι τη δυνατότητα συντήρησης, τη δυνατότητα δοκιμής και την ευελιξία του κώδικα.
Η βασική έννοια της ένεσης εξάρτησης
Τύποι ένεσης εξάρτησης
έγχυση κατασκευαστή: Το εξαρτημένο αντικείμενο περνά από τον κατασκευαστή της κλάσης.
public class OrderService
{
private readonly IProductRepository _productRepository;
public OrderService(IProductRepository productRepository)
{
_productRepository = productRepository;
}
}
Ένεση ιδιοκτησίας: Τα εξαρτημένα αντικείμενα περνούν μέσα από τις δημόσιες ιδιότητες της κλάσης.
public class OrderService
{
public IProductRepository ProductRepository { get; set; }
}
μέθοδος ένεσης: Το εξαρτημένο αντικείμενο περνά μέσα από την παράμετρο μεθόδου της κλάσης.
public class OrderService
{
public void ProcessOrder(IProductRepository productRepository)
{
// 使用 productRepository 处理订单
}
}
Το Dependency Injection (DI) είναι ένα σχέδιο σχεδίασης μέσω του οποίου η δημιουργία αντικειμένων και η διαχείριση των εξαρτήσεων μεταξύ αντικειμένων μπορεί να μεταφερθεί από το εσωτερικό του αντικειμένου σε ένα εξωτερικό δοχείο ή πλαίσιο. Υπάρχουν αρκετοί σημαντικοί λόγοι και πλεονεκτήματα για την ένεση εξάρτησης:
Αυτό το άρθρο χρησιμοποιεί το έργο WPF Gallery για να μάθετε πώς να χρησιμοποιείτε την ένεση εξάρτησης στη διεύθυνση κώδικα WPF.
https://github.com/microsoft/WPF-Samples/blob/main/SampleApplications/WPFGallery
Για την εφαρμογή της ένεσης εξάρτησης σε αυτό το έργο, χρησιμοποιούνται αυτά τα δύο πακέτα:
Πρώτα κοιτάξτε τα περιεχόμενα του App.xaml.cs:
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();
}
}
Τι είναι το IHost;
Σε C#,IHost
είναι μια διεπαφή που χρησιμοποιείται στο .NET για τη δημιουργία και τη διαμόρφωση εφαρμογώνHost
έννοια αφηρημένη.IHost
Μια διεπαφή ορίζει μια συλλογή υπηρεσιών και στοιχείων που απαιτούνται για την εκκίνηση, την εκτέλεση και τη διαχείριση μιας εφαρμογής. Συνήθως χρησιμοποιείται με εφαρμογές ASP.NET Core, αλλά λειτουργεί και με άλλους τύπους εφαρμογών .NET, όπως εφαρμογές κονσόλας ή προγράμματα WPF.
IHost
Η διεπαφή αποτελείται απόHostBuilder
Υλοποίηση κλάσης, η οποία παρέχει τη δημιουργία και τη διαμόρφωση τουIHost
μέθοδοι παραδείγματος.HostBuilder
Σας επιτρέπει να προσθέσετε διάφορες υπηρεσίες, όπως καταγραφή, διαμόρφωση, δοχεία έγχυσης εξάρτησης κ.λπ., και να διαμορφώσετε τη συμπεριφορά εκκίνησης και διακοπής της εφαρμογής σας.
Παρέχει πρακτικές μεθόδους για τη δημιουργία παρουσιών Microsoft.Extensions.Hosting.IHostBuilder με προρυθμισμένες προεπιλογές.
Επιστρέφει ένα IHostBuilder.
Προσθέστε υπηρεσίες στο κοντέινερ. Αυτή η λειτουργία μπορεί να κληθεί πολλές φορές και τα αποτελέσματά της είναι αθροιστικά.
Η έννοια της παραμέτρου configureDelegate είναι να ρυθμίσετε τις παραμέτρους του πληρεξούσιου του Microsoft.Extensions.DependencyInjection.IServiceCollection.
Αυτή η συλλογή θα χρησιμοποιηθεί για την κατασκευή System.IServiceProvider.
Ο πληρεξούσιος απαιτεί δύο τύπους παραμέτρων: HostBuilderContext και IServiceCollection, οι οποίοι δεν έχουν τιμή επιστροφής.
Μια έκφραση λάμδα που ικανοποιεί τον τύπο πληρεξουσίου μεταβιβάζεται εδώ.
Σε C#,() => {}
Είναι μια σύνταξη για εκφράσεις λάμδα. Οι εκφράσεις λάμδα είναι ένα ελαφρύ περιτύλιγμα πληρεξουσίων που σας επιτρέπει να ορίσετε μια ανώνυμη μέθοδο και να τη μεταβιβάσετε ως παράμετρο σε μια μέθοδο που υποστηρίζει εκπροσώπους ή δέντρα εκφράσεων.
Οι εκφράσεις λάμδα παρέχουν έναν συνοπτικό τρόπο ορισμού μεθόδων και είναι χρήσιμες ειδικά όταν χρειάζεται να μεταβιβάσετε μεθόδους ως παραμέτρους σε άλλες μεθόδους.
Κατά την προσθήκη υπηρεσιών, υπάρχουν δύο κύκλοι ζωής εδώ, εκτός από το AddSingleton και το AddTransient, υπάρχει και το AddScoped.
Αυτές οι μέθοδοι ορίζουν τον κύκλο ζωής της υπηρεσίας, δηλαδή πώς δημιουργούνται και διαχειρίζονται οι παρουσίες υπηρεσίας στην εφαρμογή.
Προσθήκη Singleton
Προσθήκη Μεταβατικού
AddScoped
χρησιμοποιήστε αυτές τις υπηρεσίες
Στην Κύρια συνάρτηση:
ξεκίνα_host
,πέρασμα_host.Services.GetRequiredService<MainWindow>();
Λάβετε την παρουσία του MainWindow.
Λαμβάνοντας ως παράδειγμα την κλάση MainWindow, προβάλετε τον κατασκευαστή του MainWindow στο MainWindow.xaml.cs:
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;
}
Μετά την κατάργηση του περιεχομένου που δεν σχετίζεται με αυτό το θέμα, έχει ως εξής:
public MainWindow(MainWindowViewModel viewModel, IServiceProvider serviceProvider, INavigationService navigationService)
{
_serviceProvider = serviceProvider;
ViewModel = viewModel;
_navigationService = navigationService;
}
Παρατηρήσατε ότι δεν χρειάζεται πλέον να ανεβάσετε αυτά τα αντικείμενα. Η διαχείριση αυτών των αντικειμένων γίνεται από το κοντέινερ έγχυσης εξάρτησης.
Εάν δεν χρησιμοποιείται ένεση εξάρτησης, μπορεί να μοιάζει με αυτό:
public MainWindow()
{
_serviceProvider = new IServiceProvider();
ViewModel = new MainWindowViewModel();
_navigationService = new INavigationService();
}
Αυτό το άρθρο εισάγει πρώτα την έννοια της ένεσης εξάρτησης, στη συνέχεια εξηγεί γιατί απαιτείται ένεση εξάρτησης και, τέλος, μαθαίνει πώς να χρησιμοποιείτε την ένεση εξάρτησης στο WPF μέσω του έργου WPF Gallery.
1、[WPF-Samples/Sample Applications/WPFGallery στο κύριο · microsoft/WPF-Samples (github.com)](https://github.com/microsoft/WPF-Samples/tree/main/Sample Applications/WPFGallery)