Splat 与 Microsoft.Extensions.DependencyInjection 整合

许多 avalonia 项目都使用 Splat,如果习惯使用 Microsoft.Extensions.DependencyInjection 需要进行整合,下面以 android 项目为例,介绍如何将 Splat 与 Microsoft.Extensions.DependencyInjection 整合。

原理是调用 AppLocator.SetLocatorSplat 内部改为 Microsoft.Extensions.DependencyInjection 组件

  1. 引用 Splat.Microsoft.Extensions.DependencyInjection

手册 https://github.com/reactiveui/splat/blob/main/src/Splat.Microsoft.Extensions.DependencyInjection/README.md

  1. 调用 services.UseMicrosoftDependencyResolver()
# 要尽早调用, 这样调用 `Splat` 注册实际都注册到了内部的 Microsoft DI 容器中

builder = Host.CreateApplicationBuilder();
builder.Services.UseMicrosoftDependencyResolver();
  1. 其它注入

在 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();
}
  1. 继续完成 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;
  1. Splat 的组件经常与 ReactiveUI 配合使用, 所以为了安全可以引用 ReactiveUI.Avalonia (注: 原来的 Avalonia.ReactiveUI 已经被废弃了)然后调用 UseReactiveUI() 初始化一下 ReactiveUI 系统
上一篇
下一篇