Как поделиться 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).