许多 avalonia 项目都使用 Splat,如果习惯使用 Microsoft.Extensions.DependencyInjection 需要进行整合,下面以 android 项目为例,介绍如何将 Splat 与 Microsoft.Extensions.DependencyInjection 整合。
原理是调用 AppLocator.SetLocator 将 Splat 内部改为 Microsoft.Extensions.DependencyInjection 组件
- 引用
Splat.Microsoft.Extensions.DependencyInjection
- 调用
services.UseMicrosoftDependencyResolver()
# 要尽早调用, 这样调用 `Splat` 注册实际都注册到了内部的 Microsoft DI 容器中
builder = Host.CreateApplicationBuilder();
builder.Services.UseMicrosoftDependencyResolver();
- 其它注入
在 MainActivity 中想继续调用 microsoft DI 注入, 可以在
AppBuilder.AfterSetup回调中获取 App 进行 DI 配置
protected override AppBuilder CustomizeAppBuilder(AppBuilder builder) {
// Splat.Locator.CurrentMutable.RegisterLazySingleton<IAuthService>(() => new AndroidAuthService());
return base.CustomizeAppBuilder(builder)
.AfterSetup(appBuilder => {
if (appBuilder.Instance is App app) {
// 在这里进行 DI 配置
app.RegisterServices(services => {
services.AddSingleton < IBrowserFactory, BrowserFactory > ();
services.AddSingleton < IVersionService, VersionService > ();
services.AddSingleton(this);
});
}
})
.UseShell() // 这里第三方组件,就是调用了 `Splat` 进行注册
.WithInterFont();
}
- 继续完成 Splat 与 Microsoft DI 系统的注入
# 在 Build() 前要使用一下 Splat 系统,让它完成初始化,因为 Splat 系统初始化时还会注入一些服务, 如果这时已经调用了 Build() ,再注入服务就会提示错误
// 这里都是为了初始化一下 Splat 系统, RxApp.MainThreadScheduler 应该够了,如果还有问题,其它也调用下看
// Locator.CurrentMutable.InitializeReactiveUI();
// Locator.CurrentMutable.InitializeSplat();
IScheduler _ = RxApp.MainThreadScheduler;
_host = builder.Build();
// 手册提示要再注入一次
_host.Services.UseMicrosoftDependencyResolver();
// 下面正常的使用 Microsoft DI 或是 Splat 系统就可以了
IServiceProvider serviceProvider = _host.Services;
- 用
Splat的组件经常与ReactiveUI配合使用, 所以为了安全可以引用ReactiveUI.Avalonia(注: 原来的Avalonia.ReactiveUI已经被废弃了)然后调用UseReactiveUI()初始化一下ReactiveUI系统