using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace FlowerShopContracts.DI { public static partial class ServiceProviderLoader { public static IImplementationExtension? GetImplementationExtensions() { IImplementationExtension? source = null; // массив строк, представляющий пути ко всем файлам длл в этой директории и подпапках 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()) { // если тип является классом и реализует интерфейс ИИЕ if (t.IsClass && typeof(IImplementationExtension).IsAssignableFrom(t)) { if (source == null) { // создаем экземпляр этого класса source = (IImplementationExtension)Activator.CreateInstance(t)!; } else { // сравнение приоритетов текущего и нового экземпляра var newSource = (IImplementationExtension)Activator.CreateInstance(t)!; if (newSource.Priority > source.Priority) { source = newSource; } } } } } return source; } 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"; } } }