Как динамически регистрировать службы с помощью ServiceProvider в .net maui blazor HybridC#

Место общения программистов C#
Ответить
Anonymous
 Как динамически регистрировать службы с помощью ServiceProvider в .net maui blazor Hybrid

Сообщение Anonymous »

Я хочу создать систему плагинов в своем гибридном приложении .net Maui Blazor, что приводит меня к проблеме создания нового поставщика услуг и использования его вместо стандартного. Как сообщить Blazor, чтобы он использовал только вновь созданного ServiceProvider?
Я создал класс 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;
}
}
Наконец, в Main.razor у меня есть следующий код:

Код: Выделить всё

@page "/"
@inject IEumerbale
 Plugins
@inject IPluginInstaller PluginInstaller

@code {
protected override void OnInitialized()
{
PluginInstaller.InstallPlugin();
var counter = Plugins.Count() // gives 0
}
}
Мне кажется, что внедрение IPluginInstaller сохраняет активным контейнер зависимостей по умолчанию, поэтому blazor не использует автоматически вновь созданный, поскольку ссылка все еще используется (с @inject IPluginInstaller), несмотря на ServiceLocator .ServiceProvider = новыйServiceProvider; Если я получуService из ServiceLocator.ServiceProvider, он увидит добавленные плагины.
Знаете ли вы, как решить эти проблемы? Возможно, подход нужно кардинально изменить..

Подробнее здесь: https://stackoverflow.com/questions/785 ... -blazor-hy
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»