本文记录下WPF程序如何使用依赖注入。代码是在之前WPF使用MVVM模式开发的代码基础上修改的,MVVM的内容见下面链接。
WPF使用MVVM模式开发
废话不多说,直接上代码:
-
nuget添加Microsoft.Extensions.DependencyInjection包
-
修改App.xaml.cs文件如下:
public App()
{
Services = ConfigureServices();
//this.InitializeComponent();
}
/// <summary>
/// Gets the current <see cref="App"/> instance in use
/// </summary>
public new static App Current => (App)Application.Current;
/// <summary>
/// Gets the <see cref="IServiceProvider"/> instance to resolve application services.
/// </summary>
public IServiceProvider Services { get; }
/// <summary>
/// Configures the services for the application.
/// </summary>
private static IServiceProvider ConfigureServices()
{
var services = new ServiceCollection();
services.AddSingleton<MainView>();
services.AddSingleton<MainViewModel>();
services.AddSingleton<ITestService, TestService>();
return services.BuildServiceProvider();
}
protected override void OnStartup(StartupEventArgs e)
{
Services.GetRequiredService<MainView>()
.Show();
base.OnStartup(e);
}
- App.xaml文件中把StartupUri去掉,窗口的启动入口上方代码中已经放在了OnStartup方法中。
- MainView中使用依赖注入viewmodel
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using WpfMVVM.ViewModels;
namespace WpfMVVM.Views
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainView : Window
{
protected readonly MainViewModel _VM;
public MainView(MainViewModel VM)
{
InitializeComponent();
DataContext = _VM = VM;
}
}
}
5.代码库