WPF MVVM项目依赖注入场景下打开MainView主窗口的最优实现方案
WPF MVVM 依赖注入场景下打开主窗口的实现方案
步骤1:注册视图和ViewModel到依赖注入容器
在你OnStartup方法中配置Host的代码段,将MainView和MainViewModel都注册到DI服务集合中,示例代码如下:
_host = Host.CreateDefaultBuilder(e.Args) .ConfigureServices((context, services) => { // 注册ViewModel,根据业务需求选择Singleton/Transient/Scoped生命周期 services.AddSingleton<MainViewModel>(); // 注册主窗口 services.AddSingleton<MainView>(); // 你其他的业务服务注册逻辑写在这里 }) .Build();
步骤2:从DI容器解析主窗口实例并打开
Host启动完成后,直接从DI容器中获取MainView实例即可,DI会自动帮你注入构造函数所需的MainViewModel参数,无需手动传参:
private async void OnStartup(object sender, StartupEventArgs e) { var appLocation = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); // 此处为你原有Host配置逻辑,添加步骤1中的服务注册代码 _host = Host.CreateDefaultBuilder(e.Args) .ConfigureServices((context, services) => { services.AddSingleton<MainViewModel>(); services.AddSingleton<MainView>(); // 其他服务注册 }) .Build(); await _host.StartAsync(); // 从DI容器获取MainView实例,自动注入依赖 var mainView = _host.Services.GetRequiredService<MainView>(); // 赋值为应用全局主窗口 Application.Current.MainWindow = mainView; mainView.Show(); }
注意事项
- 无需修改
App.xaml配置,保留原有Startup="OnStartup"即可,不要设置StartupUri - 如果你使用第三方DI容器(如Autofac),只要保证
MainView和它的所有依赖都完成注册,从容器解析实例的逻辑完全一致 - 主窗口通常全局唯一,建议使用
AddSingleton生命周期注册,如果有特殊需求需要多实例,可改为AddTransient
内容的提问来源于stack exchange,提问作者Melissa
相关产品推荐
相关产品推荐

