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”
错误原因
- 构造函数调用语法错误:
new InformationView(InformationViewModel informationViewModel)是错误写法——调用构造函数传参时,不能在参数位置声明类型,这是方法定义的语法,而非实例化传参语法。 - 未利用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
相关产品推荐
相关产品推荐

