MAUI-依赖注入

2022-09-05 10:27 Monday8212min
CC BY 4.0(除特别声明和转载)

依赖注入使用

当某个角色需要另一个角色的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。所谓依赖注入,是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入。
当创建完成MonkeyService服务:

using System.Net.Http.Json;

namespace MonkeyFinder.Services;

public class MonkeyService
{
    HttpClient httpClient;
    public MonkeyService()
    {
        this.httpClient = new HttpClient();
    }

    List<Monkey> monkeyList = new();
    public async Task<List<Monkey>> GetMonkeys()
    {
        var response = await httpClient.GetAsync("https://www.montemagno.com/monkeys.json");

        if (response.IsSuccessStatusCode)
        {
            monkeyList = await response.Content.ReadFromJsonAsync<List<Monkey>>();
        }
            return monkeyList;
    }
}

要从ViewModel调用MonkeyService,即可采用依赖注入。
使用 ObservableCollection<Monkey> 加载 Monkey 对象,因为它内置支持在我们从集合中添加或删除项目时引发 CollectionChanged 事件。这意味着减少手动调用 OnPropertyChanged。将using MonkeyFinder.Services;这一using 指令添加到文件顶部以访问MonkeyService。通过构造函数注入MonkeyService。完整调用过程如下:

namespace MonkeyFinder.ViewModel;
using MonkeyFinder.Services;
public partial class MonkeysViewModel : BaseViewModel
{
    public ObservableCollection<Monkey> Monkeys { get; } = new();
    MonkeyService monkeyService;
    public MonkeysViewModel(MonkeyService monkeyService)
    {
        Title = "Monkey Finder";
        this.monkeyService = monkeyService;
    }
    [RelayCommand]
    async Task GetMonkeysAsync()
    {
        if (IsBusy)
            return;

        try
        {
            IsBusy = true;
            var monkeys = await monkeyService.GetMonkeys();
            if (Monkeys.Count != 0)
                Monkeys.Clear();

            foreach (var monkey in monkeys)
                Monkeys.Add(monkey);
        }
        catch (Exception ex)
        {
            Debug.WriteLine($"Unable to get monkeys: {ex.Message}");
            await Shell.Current.DisplayAlert("Error!", ex.Message, "OK");
        }
        finally
        {
            IsBusy = false;
        }

    }

    [RelayCommand]
    async Task GoToDetails(Monkey monkey)
    {
        if (monkey == null)
            return;

        await Shell.Current.GoToAsync(nameof(DetailsPage), true, new Dictionary<string, object>
    {
        {"Monkey", monkey }
    });
    }
}

注册

在我们可以运行应用程序之前,我们必须注册我们所有的依赖项。 打开MauiProgram.cs文件。
添加using MonkeyFinder.Services;来访问我们的 MonkeyService。找到我们在builder.Services中注册Main Page的位置,并在其上方添加以下内容:

builder.Services.AddSingleton<MonkeyService>();
builder.Services.AddSingleton<MonkeysViewModel>();

我们将MonkeyServiceMonkeysViewModel注册为单例。 这意味着它们只会被创建一次,如果我们希望每个请求都创建一个唯一的实例,我们会将它们注册为“瞬态1”。在项目后面的代码中,我们将把我们的MonkeysViewModel注入到我们的MainPage中:

	public MainPage(MonkeysViewModel viewModel)
	{
		InitializeComponent();
        BindingContext = viewModel;
    }

  1. Transient,使用AddTransient()来注册 ↩︎

BuyMeACola