私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
この記事では、WPF ギャラリー プロジェクトを使用して、依存関係の挿入の関連概念と、WPF で依存関係の挿入を実行する方法を学習します。
依存性注入 (DI) は、制御反転 (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 处理订单
}
}
依存関係の挿入 (DI) は、オブジェクトの作成とオブジェクト間の依存関係の管理をオブジェクト内から外部のコンテナーまたはフレームワークに転送できる設計パターンです。依存関係の注入には、いくつかの重要な理由と利点があります。
この記事では、WPF ギャラリー プロジェクトを使用して、WPF コード アドレスで依存関係の挿入を使用する方法を学習します。
https://github.com/microsoft/WPF-Samples/blob/main/SampleApplications/WPFGallery
このプロジェクトで依存関係の注入を実装するには、次の 2 つのパッケージが使用されます。
まず、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();
}
}
Iホストとは何ですか?
C#では、IHost
.NET でアプリケーションを構築および構成するために使用されるインターフェイスですHost
概念の要約。IHost
インターフェイスは、アプリケーションの起動、実行、管理に必要なサービスとコンポーネントのコレクションを定義します。通常、ASP.NET Core アプリケーションで使用されますが、コンソール アプリケーションや WPF プログラムなど、他の種類の .NET アプリケーションでも動作します。
IHost
インターフェースは次のもので構成されますHostBuilder
クラス実装。これにより、IHost
インスタンスメソッド。HostBuilder
ロギング、構成、依存関係注入コンテナーなどのさまざまなサービスを追加し、アプリケーションの起動および停止の動作を構成できます。
事前構成された既定値を使用して Microsoft.Extensions.Hosting.IHostBuilder インスタンスを作成するための便利なメソッドを提供します。
IHostBuilder を返します。
コンテナにサービスを追加します。この操作は複数回呼び出すことができ、その結果は累積されます。
パラメーターconfigureDelegateの意味は、Microsoft.Extensions.DependencyInjection.IServiceCollectionのデリゲートを構成することです。
このコレクションは、System.IServiceProvider を構築するために使用されます。
デリゲートには、HostBuilderContext と IServiceCollection という 2 つのパラメーター タイプが必要ですが、これらには戻り値がありません。
デリゲート型を満たすラムダ式がここに渡されます。
C#では、() => {}
ラムダ式の構文です。 ラムダ式は、匿名メソッドを定義し、それをデリゲートまたは式ツリーをサポートするメソッドにパラメータとして渡すことを可能にする軽量のデリゲート ラッパーです。
ラムダ式はメソッドを定義する簡潔な方法を提供し、メソッドをパラメータとして他のメソッドに渡す必要がある場合に特に役立ちます。
サービスを追加する場合、ここには 2 つのライフサイクルがあり、AddSingleton と AddTransient に加えて、AddScoped もあります。
これらのメソッドは、サービスのライフサイクル、つまりアプリケーション内でサービス インスタンスがどのように作成および管理されるかを定義します。
シングルトンの追加
一時的追加
スコープを追加
これらのサービスを利用する
Main 関数内:
起動する_host
、合格_host.Services.GetRequiredService<MainWindow>();
MainWindow インスタンスを取得します。
MainWindow クラスを例として、MainWindow.xaml.cs の MainWindow のコンストラクターを確認します。
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 で依存関係注入を使用する方法を学びます。
1、[WPF-Samples/Sample Applications/WPFGallery at main · microsoft/WPF-Samples (github.com)](https://github.com/microsoft/WPF-Samples/tree/main/Sample Applications/WPFGallery)