.NET MAUI 平台特定代码中的依赖注入

问题描述 投票:0回答:4

有没有办法在特定于平台的代码中注入服务,例如在

MainActivity.cs
中?我认为 Xamarin 为此使用了
DependencyService
。 是否可以将它们注入背景
Services
Broadcast Receivers

我目前尝试做的是更新它们,但我想知道目前是否有更好的解决方案。据我了解,平台特定代码中的 DI 容器与您在

MauiProgram.cs
中使用的主要容器不同,我见过他们从头开始实现一个的示例。

c# .net xamarin maui
4个回答
11
投票

我在 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 }

4
投票

@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();
}

1
投票

为什么不说

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>();
}

0
投票

现在对于 .NET MAUI 应用程序,您可以使用

IPlatformApplication.Current.Services
来访问
IServiceProvider
,因此,要解析服务
T
,您可以使用:

  • IPlatformApplication.Current.Services.GetService<T>()
  • IPlatformApplication.Current.Services.GetService(typeof(T))
© www.soinside.com 2019 - 2024. All rights reserved.