54 lines
1.3 KiB
C#
54 lines
1.3 KiB
C#
|
using System.Reflection;
|
|||
|
|
|||
|
namespace SushiBarContracts.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";
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|