在 ViewModel 中,如何获取(GetService aka Resolve)服务添加到 MauiProgram 中的 builder.Services?

In a ViewModel, how Get (GetService aka Resolve) a service added to builder.Services in MauiProgram?

总结:我希望使用 Maui 的 builder.Services 来解析视图模型中的服务。但是我不知道该怎么做。

我可以创建自己的 IServiceProvider,但我希望避免所需的样板代码,因此寻求“标准 Maui”解决方案。

我在 MauiProgram.CreateMauiApp 中添加了以下行:

builder.Services.AddSingleton<IAlertService, AlertService>();

以及相应的声明(在其他文件中):

public interface IAlertService
{
    // ----- async calls (use with "await") -----
    Task ShowAlertAsync(string title, string message, string cancel = "OK");
    Task<bool> ShowConfirmationAsync(string title, string message, string accept = "Yes", string cancel = "No");
}

internal class AlertService : IAlertService
{
    // ----- async calls (use with "await") -----

    public Task ShowAlertAsync(string title, string message, string cancel = "OK")
    {
        return Application.Current.MainPage.DisplayAlert(title, message, cancel);
    }

    public Task<bool> ShowConfirmationAsync(string title, string message, string accept = "Yes", string cancel = "No")
    {
        return Application.Current.MainPage.DisplayAlert(title, message, accept, cancel);
    }
}

然后在我的BaseViewModel中class:

internal class BaseViewModel
{
    protected static IAlertService AlertSvc = ??? GetService (aka Resolve) ???
    
    public static void Test1()
    {
        Task.Run(async () =>
            await AlertSvc.ShowAlertAsync("Some Title", "Some Message"));
    }
}

问题:MauiProgram注册的服务如何填写AlertSvc

CREDIT:基于某些 SO 讨论或 Maui 问题中建议的“DialogService”。抱歉,我忘记了原件。

所有依赖项都将通过作为 .NET MAUI 一部分的 IServiceProvider 实现提供。幸运的是,IServiceProvider 本身也被添加到依赖注入容器中,因此您可以执行以下操作。

MauiProgram.cs:

中添加你需要的依赖注入容器
builder.Services.AddSingleton<IStringService, StringService>();
builder.Services.AddTransient<FooPage>();

为了完整起见,我的 StringService 看起来像这样:

public interface IStringService
{
    string GetString();
}

public class StringService : IStringService
{
    public string GetString()
    {
        return "string";
    }
}

然后在你的 FooPage 中,当然也可以是你的视图模型或任何东西,添加一个构造函数,如下所示:

public FooPage(IServiceProvider provider)
{
    InitializeComponent();

    var str = provider.GetService<IStringService>().GetString();
}

在这里您可以看到您通过 IServiceProvider 手动解析了该服务,您可以调用它。请注意,您需要在此处添加一些错误处理以查看服务是否真的可以得到解决。