59 lines
2.1 KiB
C#
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";
|
|
}
|
|
}
|
|
|
|
}
|