SuperAPI AI 工具集

maui-dependency-injection

通用与其它

查看项目

更新于 10-16 00:05

技能介绍

用途:指导在 .NET MAUI 应用中配置依赖注入。MAUI 使用与 ASP.NET Core 相同的 Microsoft.Extensions.DependencyInjection 容器,所有服务注册在 MauiProgram.CreateMauiApp() 的 builder.Services 上,容器在启动时构建一次,之后不可变。

主要能力:注册服务、ViewModel 与 Page;在 AddSingleton、AddTransient、AddScoped 之间选择生命周期;为 Page 和 ViewModel 接线构造函数注入;借助 Shell 导航自动解析已注册的 Page;用 #if 指令注册平台特定实现;为可测试的服务层设计接口。

用法要点:Page 与 ViewModel 默认用 AddTransient,共享服务用 AddSingleton。注册 Page 及其 ViewModel 后,用 Routing.RegisterRoute 注册路由,Shell.Current.GoToAsync 会通过 DI 解析页面并注入构造函数依赖。导航参数不要通过构造函数注入,应让 ViewModel 实现 IQueryAttributable。平台实现用 #if ANDROID / IOS || MACCATALYST / WINDOWS 分支,并保留 #else 兜底。优先构造函数注入,仅在自定义 handler、平台回调等无法注入处使用显式解析。

限制与陷阱:MAUI 没有 ASP.NET Core 那样的请求作用域,AddScoped 实际是窗口生命周期或表现为 Singleton,除非手动创建 IServiceScope。Singleton ViewModel 会导致跨导航状态陈旧。通过 ShellContent ContentTemplate 声明的页面用 Activator.CreateInstance 创建,不走 DI,只有构造函数带依赖会抛 MissingMethodException;经路由导航的页面走 ActivatorUtilities.GetServiceOrCreateInstance。App.xaml 的 XAML 资源在 InitializeComponent() 期间解析,依赖服务的工作应推迟到 CreateWindow()。缺少平台分支会导致运行时解析为 null。不要为未使用 DI 的项目引入 DI,也不要随意更换可用的服务生命周期。

适用场景:.NET MAUI 项目的服务注册、生命周期选择、页面与 ViewModel 注入、Shell 路由解析、平台条件注册及可测试性设计。XAML 数据绑定、Shell 路由与查询参数、测试框架与 mock 库不在本技能范围内。