几年前,我创建了一套NuGet包,用于CQRS,并使用AutoFac模块来连接内部组件。我想在我的.NET MAUI开发中使用它们,因此我已将它们更新为.NET 6.0,并与我的MAUI项目链接起来,但我不确定我的注册中缺少什么。我的框架的AutoFac模块注册了一个IDateTimeService,但当我将其添加到已注册类的构造函数中时,它无法解析。
自动注入模块的启动方式如下:
编辑: 我已经组合了一个简化版的应用程序。我想也许我需要将一个新的AutoFacServiceProvider传递到App和ISomeService中,当使用AutoFac注册时,它确实会解析
。
但是,如果我尝试将ISomeService注入到另一个已注册的类中,对MainPage = serviceProvider.GetService()的调用将无法解析。如果服务是使用标准DI注册的,它将会起作用。
因此,按照AutoFac针对.NET Core的指南,我添加了Populate调用,然后加载了AutoFac模块。
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>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
});
builder.Services.AddSingleton<IAppNavigationService, AppNavigationService>();
builder.Services.AddSingleton<AppShellViewModel>();
builder.Services.AddTransient<MainPageViewModel>();
builder.Services.AddSingleton<AppShell>();
builder.Services.AddSingleton<MainPage>();
// Hook in AutoFac for the PerigeeFramework services
var autofacBuilder = new ContainerBuilder();
autofacBuilder.Populate(builder.Services);
autofacBuilder.RegisterModule(new ServicesModule());
autofacBuilder.Build(); // Invokes the Load method on the registered Modules.
return builder.Build();
}
}
自动注入模块的启动方式如下:
public class ServicesModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.Register(c =>
{
var config = c.IsRegistered<IDateTimeConfig>() ? c.Resolve<IDateTimeConfig>() : null;
return new DateTimeService(config);
}).As<IDateTimeService>().InstancePerLifetimeScope();
这是AppShellViewModel的定义
public AppShellViewModel(IDateTimeService dateTimeService)
这被注入到AppShell中:
public partial class AppShell : Shell
{
public AppShell(AppShellViewModel viewModel)
{
InitializeComponent();
BindingContext = viewModel;
在运行时,IDateTimeService
无法解析。我也尝试过不使用模块直接注册到 AutoFac,但它仍然无法解析:
// Hook in AutoFac for the PerigeeFramework services
var autofacBuilder = new ContainerBuilder();
autofacBuilder.Populate(builder.Services);
autofacBuilder.RegisterType<DateTimeService>().As<IDateTimeService>().SingleInstance();
var cont = autofacBuilder.Build();
return builder.Build();
}
我需要使用除了.NET DI之外的东西的主要原因是因为架构利用修饰器,SimpleInjector和AutfoFac提供了开箱即用的修饰器,所以我选择了AutoFac。无论哪种情况,我都需要使用这种“交叉线”方法来使用AutoFac和.NET DI,因为MAUI正在使用内置的DI。有人知道我漏掉了什么步骤,导致AutoFac模块的注册信息未出现在IServiceCollection中吗?或者我可以完全用AutoFac替换MauiApp中的.NET DI吗?编辑: 我已经组合了一个简化版的应用程序。我想也许我需要将一个新的AutoFacServiceProvider传递到App和ISomeService中,当使用AutoFac注册时,它确实会解析
![enter image description here](https://istack.dev59.com/EI03H.webp)
但是,如果我尝试将ISomeService注入到另一个已注册的类中,对MainPage = serviceProvider.GetService()的调用将无法解析。如果服务是使用标准DI注册的,它将会起作用。
有人知道如何将AutoFac服务提供程序传播为Maui将使用的服务提供程序吗? 项目在这里
YourComponentConstructor(IServiceProvider provider) { var yourComponent = provider.GetService()
}
- BetaDeltic