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

MAUI.NET构造函数依赖注入报错及单例实例获取方法

MAUI.NET 依赖注入单例获取错误修复

问题背景

在全新MAUI.NET项目中,已在MauiProgram.cs中注册以下单例服务:

builder.Services.AddSingleton<InformationView>();
builder.Services.AddSingleton<InformationViewModel>();

InformationView(ContentView)的代码实现如下:

public InformationViewModel viewModel;
public InformationView(InformationViewModel viewModel)
{
    InitializeComponent();
    viewModel = viewModel;
}

尝试在MainPage.cs中获取注册的单例时,编写了如下错误代码:

public MainPage()
{
    InitializeComponent();
    InformationView view = new InformationView(InformationViewModel informationViewModel);
}

触发以下编译错误:

Error CS1729 'InformationView' 不包含采用2个参数的构造函数
Error CS1003 语法错误,应输入“,”
Error CS0119 'InformationViewModel' 是类型,在给定上下文中无效
Error CS0103 当前上下文中不存在名称“informationViewModel”

错误原因

  1. 构造函数调用语法错误:new InformationView(InformationViewModel informationViewModel) 是错误写法——调用构造函数传参时,不能在参数位置声明类型,这是方法定义的语法,而非实例化传参语法。
  2. 未利用DI容器获取实例:手动new对象不会触发依赖注入容器的逻辑,即便注册了单例,手动创建的仍是新实例,无法复用容器中注册的单例对象。

修复方案

方案1:通过DI容器获取实例(推荐)

既然已在DI容器中注册单例,需通过容器获取实例,让容器自动处理依赖注入:

public MainPage()
{
    InitializeComponent();
    // 从DI容器获取已注册的InformationView单例,容器会自动注入其依赖的InformationViewModel
    InformationView view = MauiWinUIApplication.Current.Services.GetService<InformationView>();
}

此方式会触发完整的DI流程,确保获取到的是注册的单例实例,且依赖的InformationViewModel也会自动注入。

方案2:手动传参(不推荐)

若需手动创建实例,需修正语法错误,但此方式无法复用DI单例特性:

public MainPage()
{
    InitializeComponent();
    InformationViewModel vm = new InformationViewModel();
    InformationView view = new InformationView(vm);
}

该写法每次都会创建新的InformationViewModel实例,无法保证单例特性,仅适用于不依赖DI的场景。

补充说明

核心误区在于:手动new对象不会触发DI容器的依赖注入流程,必须通过DI容器获取首个对象,才能让容器自动处理整个依赖链的注入逻辑。使用MauiWinUIApplication.Current.Services.GetService<T>()是触发DI、获取单例的正确方式。

内容的提问来源于stack exchange,提问作者jaydopartu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:35:17