Как изменить службу реализации во время выполненияC#

Место общения программистов C#
Ответить
Anonymous
 Как изменить службу реализации во время выполнения

Сообщение Anonymous »

Мне интересно, можно ли во время выполнения изменить реализацию сервиса. Допустим, у меня есть:

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

public interface Service {} from Core project
public class ImplA : Service {} from LibraryA.dll
public class ImplB : Service {} from LibraryB.dll
А можно ли зарегистрировать только Сервис в DI и во время выполнения изменить реализацию сервиса из LibraryA или LibraryB? У меня есть метод, в котором я регистрирую все службы из библиотеки, но я не знаю, можно ли изменить библиотеку во время выполнения.
Это код, в котором я регистрирую службы:

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

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

builder.Services.AddSingleton();

RegisterServices(builder.Services);

var app = builder.Build();

return app;
}

public static void RegisterServices(IServiceCollection services)
{
string dllFileName = "LibraryA.dll";
var mobileAssembly = Assembly.GetExecutingAssembly();
var resourceName = "Application.Libraries.LibraryA.dll";
var destinationPath = Path.Combine(FileSystem.AppDataDirectory, dllFileName);

using (Stream? resourceStream = mobileAssembly.GetManifestResourceStream(resourceName))
{
if (resourceStream == null) return;
using (var fileStream = new FileStream(destinationPath, FileMode.OpenOrCreate, FileAccess.Write))
{
resourceStream.CopyTo(fileStream);
}

var dllPath = Path.Combine(FileSystem.AppDataDirectory, dllFileName);
var assembly = Assembly.LoadFrom(dllPath);
var serviceTypes = assembly.GetTypes().Where(t => t.IsClass && !t.IsAbstract && t.GetInterfaces().Any());

foreach (var implementationType in serviceTypes)
{
var interfaceType = implementationType.GetInterfaces().FirstOrDefault();
if (interfaceType != null)
{
var descriptor = services.FirstOrDefault(d => d.ServiceType == interfaceType);
if (descriptor != null)
{
services.Remove(descriptor);
}

services.AddSingleton(interfaceType, implementationType);
}
}
}
}
}
И он работает так, как я ожидал, но LibraryA.dll жестко запрограммирован в методе RegisterServices. Я хочу получить решение, в котором я мог бы гибко изменять библиотеки во время выполнения. Библиотеки – это встроенные ресурсы.

Подробнее здесь: https://stackoverflow.com/questions/791 ... in-runtime
Ответить

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

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

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

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

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