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 /// /// public static List GetImplementationExtensions() { // Список типов, по каждому из которых, должна быть выбрана наиболее приоритетная реализация // IImplementationExtension должен быть последним, поскольку все классы реализации, наследуются от него и являются им в частности Type[] types = { typeof(ILogicImplementationExtension), typeof(IImplementationExtension) }; var trueTypes = types.Select(x => (IImplementationExtension?)null).ToList(); 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()) { for (var i = 0; i < types.Length; i++) { if (t.IsClass && types[i].IsAssignableFrom(t)) { if (trueTypes[i] == null) { trueTypes[i] = (IImplementationExtension)Activator.CreateInstance(t)!; } else { var newSource = (IImplementationExtension)Activator.CreateInstance(t)!; if (newSource.Priority > trueTypes[i].Priority) { trueTypes[i] = newSource; } } } } } } return trueTypes; } 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"; } } }