.NET MAUI应用中如何将MauiContext注入Prism DI容器
问题分析与解决方案
核心问题
你原代码的错误在于先调用builder.Build()生成了MauiApp实例,之后再修改builder.Services的注册不会生效——因为Build()方法已经完成了容器的初始化,后续对builder的配置不会同步到已创建的容器中。
正确实现方式
方式一:直接在已构建的容器中注册实例
MauiApp的Services属性直接指向已初始化的服务容器,你可以直接通过它添加MauiContext实例:
public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); // 先完成其他类型注册逻辑 var mauiApp = builder.Build(); // 直接通过已创建的容器添加单例实例 var mauiContext = new MauiContext(mauiApp.Services); mauiApp.Services.AddSingleton(mauiContext); return mauiApp; }
方式二:提前注册工厂(推荐)
如果想在Build()前完成注册,可以通过工厂委托,让容器在需要MauiContext时自动解析IServiceProvider来创建实例,避免手动实例化的依赖:
public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); // 其他类型注册逻辑 // 注册MauiContext的工厂函数,容器会自动注入所需的IServiceProvider builder.Services.AddSingleton<MauiContext>(serviceProvider => new MauiContext(serviceProvider)); var mauiApp = builder.Build(); return mauiApp; }
关于ContainerLocator尝试无效的原因
你之前通过ContainerLocator.Container获取容器后,尝试解析IContainerRegistry是错误的——DryIoc中并没有这个默认注册的类型。即使拿到容器实例,正确的注册方式应该是调用container.RegisterInstance(mauiContext),但相比之下,前面两种方式更符合MAUI的DI使用规范,也更简洁。
内容的提问来源于stack exchange,提问作者tech74
相关产品推荐
相关产品推荐

