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

.NET MAUI集成AutoFac依赖注入时服务无法解析问题排查

.NET MAUI集成Autofac解决依赖注入失败问题

问题根源

你当前的代码只是创建了Autofac容器,但没有让MAUI使用这个容器作为服务提供者,MAUI依然在使用内置的DI容器,所以无法解析Autofac中注册的服务。

正确集成步骤

要让MAUI完全使用Autofac替换内置DI,需要通过UseServiceProviderFactory指定Autofac的服务提供者工厂,并在ConfigureContainer中完成Autofac的配置,而非手动创建ContainerBuilder后弃用。

修改MauiProgram代码

将CreateMauiApp方法调整为如下形式:

using Autofac;
using Autofac.Extensions.DependencyInjection;
using Pages;
using Perigee.Framework.Services;
using Services;
using ViewModels;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            // 指定Autofac作为服务提供者工厂,替换MAUI内置DI
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            });
        
        // 原生DI注册的服务会被Autofac自动接管,无需手动迁移
        builder.Services.AddSingleton<IAppNavigationService, AppNavigationService>();
        builder.Services.AddSingleton<AppShellViewModel>();
        builder.Services.AddTransient<MainPageViewModel>();
        builder.Services.AddSingleton<AppShell>();
        builder.Services.AddSingleton<MainPage>();

        // 在Autofac容器中注册模块和自定义服务
        builder.ConfigureContainer<ContainerBuilder>(autofacBuilder =>
        {
            // 注册你的CQRS框架AutoFac模块
            autofacBuilder.RegisterModule(new ServicesModule());
            
            // 也可以直接在这里注册服务(无需模块时使用)
            // autofacBuilder.RegisterType<DateTimeService>().As<IDateTimeService>().SingleInstance();
        });

        return builder.Build();
    }
}

关键说明

  • UseServiceProviderFactory(new AutofacServiceProviderFactory()):明确告知MAUI使用Autofac服务提供者替代内置DI容器。
  • ConfigureContainer<ContainerBuilder>:MAUI构建容器时会自动调用此方法,你可以在这里完成所有Autofac专属配置,包括模块注册、服务绑定、装饰器实现等。
  • 原生builder.Services注册的服务会被Autofac自动导入,无需手动调用Populate方法(内部已处理该逻辑)。

精简项目适配调整

在你的精简项目中,无需手动传递AutoFacServiceProvider给App,通过上述方式配置后,MAUI会全程使用Autofac容器解析服务。此时AppShell依赖的AppShellViewModel,以及AppShellViewModel依赖的IDateTimeService都会被Autofac正确解析。

装饰器模式实现示例

Autofac原生支持的装饰器模式可直接在ConfigureContainer中配置,例如:

builder.ConfigureContainer<ContainerBuilder>(autofacBuilder =>
{
    // 注册原始服务实例
    autofacBuilder.RegisterType<DateTimeService>().Named<IDateTimeService>("original-service");
    // 注册装饰器,包裹原始服务
    autofacBuilder.RegisterDecorator<DateTimeServiceDecorator, IDateTimeService>("original-service");
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:03:25