在 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
手动解析了该服务,您可以调用它。请注意,您需要在此处添加一些错误处理以查看服务是否真的可以得到解决。
总结:我希望使用 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
手动解析了该服务,您可以调用它。请注意,您需要在此处添加一些错误处理以查看服务是否真的可以得到解决。