Maui App 中数据库初始化代码放在哪里

Dav*_*rke 2 c# sqlite-net .net-core maui

我创建了一个 .net 标准类库服务,用于在我的新 Maui 应用程序中访问 sqlite 数据库。我的问题是在哪里调用初始化代码。我添加了 DI 注册,其中MauiProgram.cs将 my 注册DbService为接口的实现IDbService

builder
    .Services
        .AddSingleton<IDbService>(serviceProvider => 
            ActivatorUtilities.CreateInstance<DbService>(serviceProvider, databasePath))
        .AddSingleton<MainViewModel>()
        .AddSingleton<MainPage>();
Run Code Online (Sandbox Code Playgroud)

初始化数据库的代码(创建表、加载测试数据)我目前已放入主页视图模型的构造函数中,该视图模型注册为单例,因此初始化只会发生一次。但显然在构造函数中调用异步初始化代码是错误的。正确的位置在哪里?

Task.Run(async () =>
{
    await _dbService.Initialise();
    if (!(await _dbService.GetExperiences(1, 0)).Any())
        await _dbService.LoadTestData();
    await GetData();
}).GetAwaiter().GetResult();
Run Code Online (Sandbox Code Playgroud)

Joh*_*ohn 5

对于自定义启动逻辑,通常可以选择托管服务。但 MAUI目前不支持托管服务。但是,有一个未记录的IMauiInitializeService接口可用于实现初始化逻辑。

internal class DatabaseInitializer : IMauiInitializeService
{
    public void Initialize(IServiceProvider services)
    {
        var dbService = services.GetRequiredService<IDbService>();
        Task.Run(async () =>
        {
            await dbService.Initialise();
            if (!(await dbService.GetExperiences(1, 0)).Any())
                await dbService.LoadTestData();
            await GetData();
        }).GetAwaiter().GetResult();
    }
}
Run Code Online (Sandbox Code Playgroud)

该类需要注册为以下的实现IMauiInitiailizeService

builder.Services;
        .AddSingleton<IDbService>(serviceProvider => 
            ActivatorUtilities.CreateInstance<DbService>(serviceProvider, databasePath))
        .AddSingleton<MainViewModel>()
        .AddSingleton<MainPage>()
        .AddTransient<IMauiInitializeService, DatabaseInitializer>();
Run Code Online (Sandbox Code Playgroud)

它将在应用程序构建后执行,此处

从表面上看应该是有效的。目前,我没有安装 MAUI,所以我无法确定。如果有问题请告诉我。