依赖注入使用
当某个角色需要另一个角色的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。所谓依赖注入,是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入。
当创建完成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>();
我们将MonkeyService和MonkeysViewModel注册为单例。 这意味着它们只会被创建一次,如果我们希望每个请求都创建一个唯一的实例,我们会将它们注册为“瞬态1”。在项目后面的代码中,我们将把我们的MonkeysViewModel注入到我们的MainPage中:
public MainPage(MonkeysViewModel viewModel)
{
InitializeComponent();
BindingContext = viewModel;
}
Transient,使用AddTransient
()来注册 ↩︎