Код: Выделить всё
public interface Service {} from Core project
public class ImplA : Service {} from LibraryA.dll
public class ImplB : Service {} from LibraryB.dll
Это код, в котором я регистрирую службы:
Код: Выделить всё
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);
}
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... in-runtime
Мобильная версия