Я создал класс ServiceLocator, который хранит информацию о текущем ServiceProvider и уже зарегистрированных сервисах
Код: Выделить всё
public static class ServiceLocator
{
public static IServiceProvider ServiceProvider { get; set; }
public static IServiceCollection Services { get; set; } = new ServiceCollection();
}
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
});
// Register services
builder.Services.AddScoped();
// Register other servieces...
// Save already registered services
foreach (var service in builder.Services)
{
ServiceLocator.Services.Add(service);
}
var app = builder.Build();
ServiceLocator.ServiceProvider = app.Services;
return app;
}
Код: Выделить всё
public interface IPluginInstaller
{
void InstallPlugin();
}
public class PluginInstaller : IPluginInstaller
{
public void InstallPlugin()
{
// Create new ServiceCollection
var serviceCollection = new ServiceCollection();
// Add services to new newly created collection
foreach(var service in ServiceLocator.Services)
{
serviceCollection.Add(services);
}
var plugin = new Plugin(...)
serviceCollection.AddSingleton(plugin);
serviceCollection.AddScoped();
serviceCollection.AddScoped();
// Create new ServiceProvider
var newServiceProvider = serviceCollection.BuildServiceProvider();
// Assign reference of newly created ServiceProvider
ServiceLocator.ServiceProvider = newServiceProvider;
}
}
Код: Выделить всё
@page "/"
@inject IEumerbale
Plugins
@inject IPluginInstaller PluginInstaller
@code {
protected override void OnInitialized()
{
PluginInstaller.InstallPlugin();
var counter = Plugins.Count() // gives 0
}
}
Знаете ли вы, как решить эти проблемы? Возможно, подход нужно кардинально изменить..
Подробнее здесь: https://stackoverflow.com/questions/785 ... -blazor-hy
Мобильная версия