目录

如何在Maui中使用依赖注入

依赖关系注入(DI)是 .NET 中的一等公民,如果熟悉 .NET 开发,对依赖注入则不会陌生。依赖关系注入是一种在类及其依赖关系之间实现控制反转(IoC)的技术,其中要反转的是获取依赖项的过程。通过依赖关系注入,分离了对象构建和对象使用的关注点,提高了代码的可读性和重用性。

.NET Multi-platform App UI 框架支持依赖关系注入软件设计模式。在 MVVM 模式中,依赖注入通常用于注册和解析视图模型,并注册和解析视图模型所依赖的服务。

容器

容器负责构造并注入服务,管理服务的生命周期。拥有依赖项的类,只需关注对于依赖项的使用,无需关注依赖项的创建与管理——这个过程由容器进行处理。.NET 中提供了内置的服务容器IServiceProvider,可以使用IServiceProvider来解析依赖的服务。

一般地,在应用程序启动时,将服务注册到IServiceCollection中,然后调用BuildServiceProvider扩展方法,即可得到IServiceProvider容器。

在 Maui 中,生成IServiceProvider的过程是框架自动完成的,只需要在MauiProgram.cs中将服务注册到IServiceCollection即可。

注册服务

在注入服务前,必须先将服务注册到容器中。Maui 内置的容器ISeviceProvider位于MauiApp中。

应用程序启动时,调用MauiProgram.cs中的 CreateMauiApp设置并构造MauiApp。首先调用 CreateBuilder创建一个构造器,通过这个构造器完成创建MauiApp所需的全部设置,其中包括服务注册,最终通过Build方法构造 MauiApp 实例。

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
    var builder = MauiApp.CreateBuilder();

    builder
    .UseMauiApp<App>()
    .ConfigureFonts(fonts =>
    {
        fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
    });

    return builder.Build();
    }
}

在.NET中注册服务,就是在应用程序启动时,将服务注册到 IServiceCollection 中。在MauiAppBuilder中,存在IServiceCollection类型的属性Services。因此,在 Maui 应用程序中注册服务,只需在构造MauiApp时将服务添加到MauiAppBuilder中的 Services中。

public static MauiApp CreateMauiApp()
{
    var builder = MauiApp.CreateBuilder();

    ...

    builder.Services.AddSingleton<MainPage>();

    return builder.Build();
}

在进行依赖关系注入时,需要从容器中解析服务。通过调用IServiceCollection的扩展方法 BuildServiceProvider可以构造获取 IServiceProvider容器实例。

调用MauiAppBuilderBuild方法获取 MauiApp实例时,将调用BuildServiceProvider,构造出IServiceProvider并赋值给MauiApp中的Services属性。

注入服务

注册服务后,可以通过容器来解析服务实例,也可将其作为依赖项进行注入。

依赖关系注入通常有构造函数注入、属性注入与方法注入三种方式。在 Maui 中,一般会使用构造方法注入依赖项,在平台代码中有时也会直接通过MauiApp实例来解析依赖项。

public partial class App : Application
{
    public App(MainPage mainPage)
    {
        InitializeComponent();

        MainPage = mainPage;
    }
}

MainPage注册到容器中后,可以通过构造函数注入的方式将其作为依赖项注入。在特定平台的代码中,有时无法使用构造函数注入,这时可以直接通过容器解析依赖项。

public class MyActivity : MauiAppCompatActivity
{
    private readonly IHelloService _helloService;

    public MyActivity()
    {
        _helloService = MauiApplication.Current.Services.GetRequiredService<IHelloService>();
    }
}

关注微信公众号“捕获异常”,获取最新文章推送,提升你的技能。