2023-05-05 10:36:33 +04:00

56 lines
2.0 KiB
C#

using System.Reflection;
namespace SushiBarContracts.DI;
public static partial class ServiceProviderLoader
{
public static List<IImplementationExtension?> GetImplementationExtensions()
{
Type[] types =
{
typeof(ILogicImplementationExtension),
typeof(IImplementationExtension)
};
var trueTypes = types.Select(x => (IImplementationExtension?)null).ToList();
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())
{
for (var i = 0; i < types.Length; i++)
{
if (t.IsClass && types[i].IsAssignableFrom(t))
{
if (trueTypes[i] == null)
{
trueTypes[i] = (IImplementationExtension)Activator.CreateInstance(t)!;
}
else
{
var newSource = (IImplementationExtension)Activator.CreateInstance(t)!;
if (newSource.Priority > trueTypes[i].Priority)
{
trueTypes[i] = newSource;
}
}
}
}
}
}
return trueTypes;
}
private static string TryGetImplementationExtensionsFolder()
{
var directory = new
DirectoryInfo(Directory.GetCurrentDirectory());
while (directory != null && directory
.GetDirectories("ImplementationExtensions", SearchOption.AllDirectories)
.All(x => x.Name != "ImplementationExtensions"))
{
directory = directory.Parent;
}
return $"{directory?.FullName}\\ImplementationExtensions";
}
}