有没有办法在特定于平台的代码中注入服务,例如在
MainActivity.cs
中?我认为 Xamarin 为此使用了 DependencyService
。
是否可以将它们注入背景Services
和Broadcast Receivers
?
我目前尝试做的是更新它们,但我想知道目前是否有更好的解决方案。据我了解,平台特定代码中的 DI 容器与您在
MauiProgram.cs
中使用的主要容器不同,我见过他们从头开始实现一个的示例。
我在 Jame Montemagno 的 Youtube 上找到了这个。 我想这就是您正在寻找的。 视频在这里。
public static class ServiceHelper {
public static T GetService<T>() => Current.GetService<T>();
public static IServiceProvider Current =>
#if WINDOWS10_0_17763_0_OR_GREATER
MauiWinUIApplication.Current.Services;
#elif ANDROID
MauiApplication.Current.Services;
#elif IOS || MACCATALYST
MauiUIApplicationDelegate.Current.Services;
#else
null;
#endif }
@Blush 的解决方案对我有用。 我稍微改变了一下。我没有传递操作,而是传递了平台特定服务的集合并添加了这些服务。
// android implementation
protected override MauiApp CreateMauiApp()
{
IServiceCollection services = new ServiceCollection();
services.AddSingleton<ITestService, TestService>();
return MauiProgram.CreateMauiApp(services);
}
// shared app
public static MauiApp CreateMauiApp(IServiceCollection platformServices)
{
var builder = MauiApp.CreateBuilder();
// register shared services
builder.Services.AddTransient<SharedService>();
// register platform specific services
foreach (var service in platformSpecificServices)
{
builder.Services.Add(service);
}
return builder.Build();
}
为什么不说
public static MauiApp CreateMauiApp(Action<MauiAppBuilder> registerPlatformSpecificServices)
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>();
registerPlatformSpecificServices?.Invoke(builder);
return builder.Build();
}
当您从平台特定代码运行应用程序时,向那里发送一个配置器函数,例如
public MainApplication(IntPtr handle, JniHandleOwnership ownership)
: base(handle, ownership)
{
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(RegisterServices);
private static void RegisterServices(MauiAppBuilder builder)
{
builder.Services.AddScoped<ISmsProvider, SmsProvider>();
}
现在对于 .NET MAUI 应用程序,您可以使用
IPlatformApplication.Current.Services
来访问 IServiceProvider
,因此,要解析服务 T
,您可以使用:
IPlatformApplication.Current.Services.GetService<T>()
IPlatformApplication.Current.Services.GetService(typeof(T))