gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:04:14 26 4
gpt4 key购买 nike

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

builder
.Services
.AddSingleton<IDbService>(serviceProvider =>
ActivatorUtilities.CreateInstance<DbService>(serviceProvider, databasePath))
.AddSingleton<MainViewModel>()
.AddSingleton<MainPage>();

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

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

最佳答案

对于自定义启动逻辑,通常是 hosted services是要走的路。但是毛伊岛does not currently support托管服务。然而,有一个undocumented IMauiInitializeService可用于实现初始化逻辑的接口(interface)。

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();
}
}

此类需要注册为 IMauiInitiailizeService 的实现:

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

它将在应用程序构建后执行,here .

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

关于c# - Maui App 中数据库初始化代码放在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72934399/

26 4 0