112 lines
3.3 KiB
C#
112 lines
3.3 KiB
C#
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
|
||
{
|
||
/// <summary>
|
||
/// Загрузчик данных
|
||
/// </summary>
|
||
public static class ServiceProviderLoader
|
||
{
|
||
private static readonly string _configFileName = "DepartmentPortal.config";
|
||
|
||
private static readonly string _pathToImplementationExt = "..\\..\\..\\..\\ImplementationExtensions\\";
|
||
|
||
private static readonly string _pathToWindowDestopExt = "..\\..\\..\\..\\WindowDestopExtensions\\";
|
||
|
||
/// <summary>
|
||
/// Получение данных с файла настроек
|
||
/// </summary>
|
||
/// <param name="key"></param>
|
||
/// <returns></returns>
|
||
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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Загрузка всех классов-реализаций IImplementationExtension
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public static List<IImplementationExtension> GetImplementationExtensions()
|
||
{
|
||
var list = new List<IImplementationExtension>();
|
||
if(Directory.Exists(_pathToImplementationExt))
|
||
{
|
||
var files = Directory.GetFiles(_pathToImplementationExt, "*.dll", SearchOption.AllDirectories);
|
||
var loadedFiles = new List<string>();
|
||
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(IImplementationExtension).IsAssignableFrom(t))
|
||
{
|
||
list.Add((IImplementationExtension)Activator.CreateInstance(t));
|
||
}
|
||
}
|
||
loadedFiles.Add(file.GetFileName());
|
||
}
|
||
}
|
||
return list;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Загрузка всех классов-реализаций IWindowDesktopExtension
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public static List<IWindowDesktopExtension> GetWindowDesktopExtensions()
|
||
{
|
||
var list = new List<IWindowDesktopExtension>();
|
||
if (Directory.Exists(_pathToWindowDestopExt))
|
||
{
|
||
var files = Directory.GetFiles(_pathToWindowDestopExt, "*.dll", SearchOption.AllDirectories);
|
||
var loadedFiles = new List<string>();
|
||
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(IWindowDesktopExtension).IsAssignableFrom(t))
|
||
{
|
||
list.Add((IWindowDesktopExtension)Activator.CreateInstance(t));
|
||
}
|
||
}
|
||
loadedFiles.Add(file.GetFileName());
|
||
}
|
||
}
|
||
return list;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Получение имени файла
|
||
/// </summary>
|
||
/// <param name="fileName"></param>
|
||
/// <returns></returns>
|
||
private static string GetFile(string fileName) => Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), fileName);
|
||
}
|
||
} |