using ModelTools.Extensions; using ModelTools.Interfaces; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Xml.XPath; namespace ModelTools.BusinessLogics { /// /// Загрузчик данных /// public static class ServiceProviderLoader { private static readonly string _configFileName = "DepartmentPortal.config"; private static readonly string _pathToLoaderExt = "..\\..\\..\\..\\Extensions\\"; /// /// Получение данных с файла настроек /// /// /// 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; } /// /// Загрузка всех классов-реализаций ILoaderExtensions /// /// public static List GetLoaderExtensions() { var list = new List(); if(Directory.Exists(_pathToLoaderExt)) { var files = Directory.GetFiles(_pathToLoaderExt, "*.dll", SearchOption.AllDirectories); var loadedFiles = new List(); foreach(var file in files.Distinct()) { if(loadedFiles.Contains(file.GetFileName())) { continue; } Assembly asm = Assembly.LoadFrom(file); foreach (var t in asm.GetExportedTypes()) { if (t.IsClass && typeof(ILoaderExtensions).IsAssignableFrom(t)) { list.Add((ILoaderExtensions)Activator.CreateInstance(t)); } } loadedFiles.Add(file.GetFileName()); } } return list; } /// /// Получение имени файла /// /// /// private static string GetFile(string fileName) => Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), fileName); } }