64 lines
1.6 KiB
C#
Raw Normal View History

2023-05-02 20:17:55 +04:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace LawFirmContracts.DI
{
2023-05-02 22:25:24 +04:00
public class ServiceProviderLoader
2023-05-02 20:17:55 +04:00
{
/// <summary>
/// Загрузка всех классов-реализаций IImplementationExtension
/// </summary>
/// <returns></returns>
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)!;
2023-05-02 22:25:24 +04:00
if (newSource.Priority > source.Priority)
2023-05-02 20:17:55 +04:00
{
source = newSource;
}
}
}
}
}
return source;
}
private static string TryGetImplementationExtensionsFolder()
{
2023-05-02 22:25:24 +04:00
var directory = new
DirectoryInfo(Directory.GetCurrentDirectory());
while (directory != null &&
!directory.GetDirectories("ImplementationExtensions",
SearchOption.AllDirectories)
.Any(x => x.Name == "ImplementationExtensions"))
2023-05-02 20:17:55 +04:00
{
2023-05-02 22:25:24 +04:00
directory = directory.Parent;
2023-05-02 20:17:55 +04:00
}
2023-05-02 22:25:24 +04:00
return $"{directory?.FullName}\\ImplementationExtensions";
2023-05-02 20:17:55 +04:00
}
2023-05-02 22:25:24 +04:00
}
2023-05-02 20:17:55 +04:00
}