Как поделиться ServiceProvider в Maui Blazor для сервисов Maui и сервисов Blazor

Я пытаюсь понять, как разделить услуги между Maui и Blazor в проекте MauiBlazor. Цель состоит в том, чтобы иметь возможность использовать одни и те же синглтоны без хранения статического экземпляра этих синглтонов.

1 ответ

Хотя это может быть более удобным способом в будущих выпусках, я нашел способ сделать это, вдохновившись примером Maui.Plugins.PageResolver . Связано с выпуском maui#792

Вот как я это решил:

1. Создайте репозиторий для поставщика услуг.

      public static class Resolver
{
    private static IServiceProvider _serviceProvider;
    public static IServiceProvider ServiceProvider => _serviceProvider ?? throw new Exception("Service provider has not been initialized");

    /// <summary>
    /// Register the service provider
    /// </summary>
    public static void RegisterServiceProvider(IServiceProvider sp)
    {
        _serviceProvider = sp;
    }
    /// <summary>
    /// Get service of type <typeparamref name="T"/> from the service provider.
    /// </summary>
    public static T Resolve<T>() where T : class
    {
        var result = _serviceProvider.GetRequiredService<T>();

        return result;
    }
}

2. Способ расширения для запуска приложения.

      public static void UseResolver(this MauiApp app)
{
    Resolver.RegisterServiceProvider(app.Services);
}

3а. Образец тестовой услуги

      public class TestSingletonService
{
    private static int _staticIndex = 0;
    public int Index {  get; set; }

    public TestSingletonService()
    {
        Index = _staticIndex++;
    }
}

3b. Зарегистрируйте коллекцию услуг

      public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .RegisterBlazorMauiWebView()
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
            });

        builder.Services.AddBlazorWebView();
        builder.Services.AddSingleton<WeatherForecastService>();

        // Register any other service / ViewModel / Page here
        builder.Services.AddSingleton<TestSingletonService>();

        var app = builder.Build();
        app.UseResolver();
        return app;
    }
}

4а. Используйте его как свою фабрику со стороны Мауи

      Resolver.ServiceProvider.GetRequiredService<TestSingletonService>();
Console.WriteLine($"Instance number {TestSingletonService.Index}");

4b. Экземпляры сервисов будут переданы вашему Blazor @inject Сервисы.

      @inject TestSingletonService tester
Instance number @(tester.Index).
Другие вопросы по тегам