You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 06:15:03