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)
对于自定义启动逻辑,通常可以选择托管服务。但 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,所以我无法确定。如果有问题请告诉我。
| 归档时间: |
|
| 查看次数: |
2675 次 |
| 最近记录: |