informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Artikel ini menggunakan proyek Galeri WPF untuk mempelajari konsep terkait injeksi ketergantungan dan cara melakukan injeksi ketergantungan di WPF.
Dependency Injection (DI) adalah pola desain yang digunakan untuk mengimplementasikan prinsip Inversion of Control (IoC). Tujuan utama dari injeksi ketergantungan adalah untuk mentransfer pembuatan objek dan pengelolaan ketergantungan antar objek dari dalam objek ke wadah atau kerangka kerja eksternal, sehingga meningkatkan kemampuan pemeliharaan, kemampuan pengujian, dan fleksibilitas kode.
Konsep inti injeksi ketergantungan
Jenis injeksi ketergantungan
injeksi konstruktor: Objek dependen dilewatkan melalui konstruktor kelas.
public class OrderService
{
private readonly IProductRepository _productRepository;
public OrderService(IProductRepository productRepository)
{
_productRepository = productRepository;
}
}
Injeksi properti: Objek yang bergantung dilewatkan melalui properti publik kelas.
public class OrderService
{
public IProductRepository ProductRepository { get; set; }
}
metode injeksi: Objek dependen dilewatkan melalui parameter metode kelas.
public class OrderService
{
public void ProcessOrder(IProductRepository productRepository)
{
// 使用 productRepository 处理订单
}
}
Dependency Injection (DI) adalah pola desain di mana pembuatan objek dan pengelolaan ketergantungan antar objek dapat ditransfer dari dalam objek ke wadah atau kerangka eksternal. Ada beberapa alasan penting dan keuntungan injeksi ketergantungan:
Artikel ini menggunakan proyek Galeri WPF untuk mempelajari cara menggunakan injeksi ketergantungan di alamat Kode WPF:
https://github.com/microsoft/WPF-Samples/blob/main/SampleApplications/WPFGallery
Untuk mengimplementasikan injeksi ketergantungan dalam proyek ini, dua paket berikut digunakan:
Pertama lihat isi 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();
}
}
Apa itu IHost?
Di C#,IHost
adalah antarmuka yang digunakan di .NET untuk membangun dan mengkonfigurasi aplikasiHost
konsep abstrak.IHost
Antarmuka mendefinisikan kumpulan layanan dan komponen yang diperlukan untuk memulai, menjalankan, dan mengelola aplikasi. Biasanya digunakan dengan aplikasi ASP.NET Core, tetapi juga berfungsi dengan jenis aplikasi .NET lainnya, seperti aplikasi konsol atau program WPF.
IHost
Antarmuka terdiri dariHostBuilder
Implementasi kelas, yang menyediakan pembuatan dan konfigurasiIHost
metode contoh.HostBuilder
Memungkinkan Anda menambahkan berbagai layanan seperti logging, konfigurasi, kontainer injeksi ketergantungan, dll., serta mengonfigurasi perilaku startup dan penghentian aplikasi Anda.
Memberikan metode kemudahan untuk membuat instans Microsoft.Extensions.Hosting.IHostBuilder dengan default yang telah dikonfigurasi sebelumnya.
Mengembalikan IHostBuilder.
Tambahkan layanan ke wadah. Operasi ini dapat dipanggil beberapa kali dan hasilnya bersifat kumulatif.
Arti dari parameterconfigDelegate adalah untuk mengkonfigurasi delegasi Microsoft.Extensions.DependencyInjection.IServiceCollection.
Koleksi ini akan digunakan untuk membangun System.IServiceProvider.
Delegasi memerlukan dua tipe parameter: HostBuilderContext dan IServiceCollection, yang tidak memiliki nilai kembalian.
Ekspresi Lambda yang memenuhi tipe delegasi diteruskan di sini.
Di C#,() => {}
Merupakan sintaksis untuk ekspresi Lambda. Ekspresi Lambda adalah pembungkus delegasi ringan yang memungkinkan Anda menentukan metode anonim dan meneruskannya sebagai parameter ke metode yang mendukung delegasi atau pohon ekspresi.
Ekspresi Lambda menyediakan cara ringkas untuk mendefinisikan metode, dan berguna terutama ketika Anda perlu meneruskan metode sebagai parameter ke metode lain.
Saat menambahkan layanan, ada dua siklus hidup di sini, selain AddSingleton dan AddTransient, ada juga AddScoped.
Metode ini menentukan siklus hidup layanan, yaitu bagaimana instans layanan dibuat dan dikelola dalam aplikasi.
TambahkanSingleton
Tambahkan Sementara
Tambahkan Cakupan
menggunakan layanan ini
Dalam fungsi Utama:
rintisan_host
,lulus_host.Services.GetRequiredService<MainWindow>();
Dapatkan instance MainWindow.
Mengambil kelas MainWindow sebagai contoh, lihat konstruktor MainWindow di 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;
}
Setelah menghapus konten yang tidak relevan dengan topik ini, tindakannya adalah sebagai berikut:
public MainWindow(MainWindowViewModel viewModel, IServiceProvider serviceProvider, INavigationService navigationService)
{
_serviceProvider = serviceProvider;
ViewModel = viewModel;
_navigationService = navigationService;
}
Pernahkah Anda memperhatikan bahwa Anda tidak perlu lagi membuat objek-objek ini sendiri? Pembuatan objek-objek ini dikelola oleh wadah injeksi ketergantungan. Ketika objek-objek ini diperlukan, mereka dapat disuntikkan melalui konstruktor seperti sekarang.
Jika injeksi ketergantungan tidak digunakan, tampilannya akan seperti ini:
public MainWindow()
{
_serviceProvider = new IServiceProvider();
ViewModel = new MainWindowViewModel();
_navigationService = new INavigationService();
}
Artikel ini pertama-tama memperkenalkan konsep injeksi ketergantungan, kemudian menjelaskan mengapa injeksi ketergantungan diperlukan, dan terakhir mempelajari cara menggunakan injeksi ketergantungan di WPF melalui proyek Galeri WPF.
1、[WPF-Samples/Sample Applications/WPFGallery di utama · microsoft/WPF-Samples (github.com)](https://github.com/microsoft/WPF-Samples/tree/main/Sample Applications/WPFGallery)