62 lines
2.3 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace LawFirmContracts.DI
{
public class ServiceProviderLoader
{
/// Загрузка всех классов-реализаций IImplementationExtension
2023-04-24 00:01:34 +04:00
public static List<IImplementationExtension?> GetImplementationExtensions()
{
2023-04-24 09:52:03 +04:00
2023-04-24 00:01:34 +04:00
Type[] types =
{
typeof(ILogicImplementationExtension),
typeof(IImplementationExtension)
};
2023-04-24 09:52:03 +04:00
var endTypes = new IImplementationExtension?[types.Length];
var files = Directory.GetFiles(TryGetImplementationExtensionsFolder(), "*.dll", SearchOption.AllDirectories);
foreach (var file in files.Distinct())
{
Assembly asm = Assembly.LoadFrom(file);
foreach (var t in asm.GetExportedTypes())
{
2023-04-24 00:01:34 +04:00
for (var i = 0; i < types.Length; i++)
{
2023-04-24 00:01:34 +04:00
if (t.IsClass && types[i].IsAssignableFrom(t))
{
2023-04-24 09:52:03 +04:00
if (endTypes[i] == null)
2023-04-24 00:01:34 +04:00
{
2023-04-24 09:52:03 +04:00
endTypes[i] = (IImplementationExtension)Activator.CreateInstance(t)!;
2023-04-24 00:01:34 +04:00
}
else
{
2023-04-24 00:01:34 +04:00
var newSource = (IImplementationExtension)Activator.CreateInstance(t)!;
2023-04-24 09:52:03 +04:00
if (newSource.Priority > endTypes[i].Priority)
2023-04-24 00:01:34 +04:00
{
2023-04-24 09:52:03 +04:00
endTypes[i] = newSource;
2023-04-24 00:01:34 +04:00
}
}
}
}
}
}
2023-04-24 09:52:03 +04:00
return endTypes.ToList();
}
private static string TryGetImplementationExtensionsFolder()
{
var directory = new DirectoryInfo(Directory.GetCurrentDirectory());
while (directory != null && !directory.GetDirectories("ImplementationExtensions", SearchOption.AllDirectories).Any(x => x.Name == "ImplementationExtensions"))
{
directory = directory.Parent;
}
return $"{directory?.FullName}\\ImplementationExtensions";
}
}
}