PIbd-23-Nasyrov-A.G.-Flower.../FlowerShopContracts/DI/ServiceProviderLoader.cs
2024-05-22 15:57:04 +04:00

59 lines
2.1 KiB
C#

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";
}
}
}