using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Xml.XPath; using ToolsModule.ManagmentExtension; namespace ToolsModule.ManagmentDependency { /// /// Загрузчик данных /// public static partial class ServiceProviderLoader { private static readonly string _configFileName = "DepartmentPortal.config"; /// /// Получение данных с файла настроек (для releaze версии сборки) /// /// /// public static string GetConfigData(string key) { var fileName = GetFile(_configFileName); if (!File.Exists(fileName)) { return string.Empty; } var doc = new XPathDocument(fileName); var nav = doc.CreateNavigator(); var data = nav.SelectDescendants(key, "", false); data.MoveNext(); return data.Current.Value; } /// /// Загрузка всех классов-реализаций IImplementationExtension /// /// public static List GetImplementationExtensions() { var list = new List(); var files = Directory.GetFiles(TryGetImplementationExtensionsFolder(), "*.dll", SearchOption.AllDirectories); var loadedFiles = new List(); foreach (var file in files.Distinct()) { if (loadedFiles.Contains(file.GetFileName())) { continue; } var asm = Assembly.LoadFrom(file); foreach (var t in asm.GetExportedTypes()) { if (t.IsClass && typeof(IDependencyRegistration).IsAssignableFrom(t)) { list.Add((IDependencyRegistration)Activator.CreateInstance(t)); } } loadedFiles.Add(file.GetFileName()); } return list; } /// /// Получение имени файла /// /// /// private static string GetFile(string fileName) => Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), fileName); 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"; } } }