我专门为Windows开发了一款毛伊岛应用程序.如果数据库中存在特定表,我希望它在启动时进行判断. 我有一个单独的类来管理数据库访问并通过依赖注入注入它.

然而,由于LifecycleEvent是在构建器中创建的,所以我无法通过通常的DI样式方式访问该类.那么我该怎么做呢?

到目前为止,我的代码如下:

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .UseMauiCommunityToolkit()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            });
        builder.Services.AddTransient<MainPage>();
        builder.Services.AddTransient<MainPageViewModel>();
        builder.Services.AddSingleton<IDatabaseAccess, DatabaseAccess>();
        builder.ConfigureLifecycleEvents(events => events.AddWindows(windows => windows
            .OnLaunching((window, args) =>
            {
                var app = App.Current;
                using (var serviceScope = App.Current.Handler.MauiContext.Services.GetService<IServiceScopeFactory>().CreateScope())
                {
                    var dbAccess =  serviceScope.ServiceProvider.GetRequiredService<IDatabaseAccess>();
                    if (!dbAccess.DoesMappingTableExist())
                    {
                        dbAccess.InitializeDb();
                    }
                }
            })));

#if DEBUG
        builder.Logging.AddDebug();
#endif

        return builder.Build();
    }
}

这不起作用,因为在运行时var app = App.Currentnull.windows参数也是如此,所以我得到了NullReferenceException.

推荐答案

OnLaunching美元太早了.将其更改为稍后的事件OnLaunched(或OnWindowCreated):

    builder.ConfigureLifecycleEvents(events => events.AddWindows(windows => windows
        .OnLaunched((window) =>
        {
            var app = App.Current;   // Has a value now.
            ...
        }

如果您确实需要访问.OnLaunking,请参见https://stackoverflow.com/a/76548416/199364,以获得联系服务Provider 的替代方法,而不依赖于App.Current.

Csharp相关问答推荐

当Visual Studio处于升级管理模式时,无法安装Torch运行时

为什么我的ASP.NET核心MVC应用程序要为HTML元素添加一些标识符?

如何从HttpContext获取请求正文

图形API基于appid列表检索多个应用程序

限制特定REST API不被访问,但部署代码

返回TyedResults.BadRequest<;字符串>;时问题详细信息不起作用

内部接口和类的DI解析

Thad.Sept()vs Task.Delay().Wait()

为什么无法将对象转换为泛型类型

使用带有参数和曲面的注入失败(&Q;)

如何比较C#中的L和ł(波兰字符)返回TRUE

当试图限制EF Select 的列时,如何避免重复代码?

异步等待Foreach循环中的ConfigureAWait(FALSE)执行什么操作?

C#LINQ延迟执行和嵌套方法

为什么我可以在注册表编辑器中更改值,但不能在以管理员身份运行的C#表单应用程序中更改?

最小API定义的Swagger标头参数

将文本从剪贴板粘贴到RichTextBox时,新文本不会在RichTextBox ForeColor中着色

如何处理ASP.NET Core中包含两个构造函数的控制器?

如何在C#中抽象Vector256;T<;的逻辑以支持不同的硬件配置?

Avalonia MVVM数据模板