我尝试在 Net Maui 应用程序中配置依赖项注入。我遵循了一些在线教程,阅读了几个 stackoverflow 线程,但是似乎没有任何效果。经过大量修改这些东西后,我不知道为什么这不起作用。
MauiApp 相当简单。 我在这里设置:Serilog、配置和项目库中的类。这应该有效。
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
InitializeLogger();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
});
// Configuration
using var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("BookLibrary.appsettings.json");
var config = new ConfigurationBuilder().AddJsonStream(stream).Build();
builder.Configuration.AddConfiguration(config);
// Logging
builder.Logging.AddSerilog(dispose: true);
builder.Services.AddTransient<IBooksDao, BooksDao>();
builder.Services.AddTransient<IChaptersDao, ChaptersDao>();
builder.Services.AddTransient<IPagesDao, PagesDao>();
builder.Services.AddTransient<IBookWriter, BookWriter>();
builder.Services.AddSingleton<MainPage>();
builder.Services.AddMauiBlazorWebView();
#if DEBUG
builder.Services.AddBlazorWebViewDeveloperTools();
builder.Logging.AddDebug();
#endif
return builder.Build();
}
private static void InitializeLogger()
{
var flushInterval = new TimeSpan(0, 0, 1);
var file = Path.Combine(AppContext.BaseDirectory, "Logs/Log_.txt");
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.Enrich.FromLogContext()
.WriteTo.File(file,
flushToDiskInterval: flushInterval,
encoding: System.Text.Encoding.UTF8,
rollingInterval: RollingInterval.Day,
retainedFileCountLimit: 22)
.CreateLogger();
}
}
MainPage 类,在构造函数中我注入了我需要的所有内容。
public partial class MainPage : ContentPage
{
private readonly IConfiguration _configuration;
private readonly ILogger _log;
private readonly IBookWriter _writer;
public MainPage(IConfiguration configuration, ILogger log, IBookWriter writer)
{
_configuration = configuration;
_log = log;
_writer = writer;
InitializeComponent();
}
}
但是,在 App 类中,有一个错误连接到
MainPage()
(它有红色下划线),并且信息表明所需参数 configuration
没有参数。如果我删除配置参数,那么问题就会变成 log
等等。看起来 DI 根本不起作用。我什至安装了 nugets:Microsoft.Extensions.Configuation.Binder
、Microsoft.Extensions.Configuation.Json
和 Serilog.Extensions.Logging
,但似乎没有任何帮助。
public partial class App : Application
{
public App()
{
InitializeComponent();
MainPage = new MainPage();
}
}
我显然在某个地方做错了,但我无法自己找到它。
您已经为
MainPage
注册了DI,因此您不必使用new MainPage()
。应该是:
public partial class App : Application
{
public App(MainPage mainpage)
{
InitializeComponent();
MainPage = mainpage;
}
}