硬件管理平台-硬件网关-插件模块-集成(上)
硬件管理平台-硬件网关-插件模块-集成(上)
本章内容
本章主要是将插件项目(HardwareGatewayPlugin)集成到HardwareGatewayWebApi项目中。
操作
创建单例模式类
由于HardwareGatewayWebApi项目是WebApi项目,可能后续还会有其他controller加入进来,因此我们的插件模块只针对HardwareGatewayController这个controller。
在该controller中我们创建单例类
internal sealed class HGSingleton
{
private HGSingleton() { }
private static volatile HardwareService _Singleton = null;
private static object syncRoot = new object();
internal static HardwareClient Instance()
{
if (_Singleton == null)
{
lock (syncRoot)
{
if (_Singleton == null)
{
_Singleton = new HardwareClient();
_Singleton.Initiation();
}
}
}
return _Singleton;
}
internal static void Close()
{
_Singleton.Close();
}
}
其中HardwareService类为操作HardwareGatewayPlugin项目的核心类。
HardwareService
硬件服务主要实现了controller中的接口类,并通过调用插件项目的load进行声明,然后通过触发相关的Function功能进行操作。
该服务主要功能:
- 初始化ini配置文件
- 调用插件项目的load方法,初始化反射类的实例
注:目前只能实现获取实例,后续调用模块及调度任务请参见后续章节
初始化ini
在HardwareLibrary中创建IniSetting类,并根据项目情况设置相关配置文件变量。
下面给出部分配置信息变量
public class IniSetting
{
/// <summary>
/// 上位机系统IP
/// </summary>
public string Ip { get; set; }
/// <summary>
/// 智能库房系统端口
/// </summary>
public string Port { get; set; }
/// <summary>
/// 公共部分
/// </summary>
public string DefaultURL { get; set; }
/// <summary>
/// 默认url
/// </summary>
public string MethodURL { get; set; }
/// <summary>
/// 网关主键
/// </summary>
public string GatewayId { get; set; }
/// <summary>
/// 日志级别
/// RELEASE 只报错误信息
/// DEBUG 调试模式 info和error信息
/// </summary>
public String LoggerLevel { get; set; } = "RELEASE";
public static IniSetting getIniSetting() {
IniSetting iniSetting = new IniSetting();
IniOpt iniOpt = new IniOpt();
iniSetting.Ip = iniOpt.ReadString("SETTING", "IP", "");
iniSetting.Port = iniOpt.ReadString("SETTING", "PORT", "");
iniSetting.DefaultURL = iniOpt.ReadString("SETTING", "DEFAULTURL", "");
iniSetting.MethodURL = iniOpt.ReadString("SETTING", "METHODURL", "");
return iniSetting;
}
}
在Initiation方法中添加配置文件的方法InitSetting,该方法代码如下(罗列了部分变量)
iniSetting = IniSetting.getIniSetting();
在HardwareAbstract.cs中添加对配置文件的操作:
- 添加一个IniSetting的变量声明
- 在构造函数中给该变量赋值IniSetting.getIniSetting();
加载插件项目
在Initiation方法中添加配置文件的方法RefreshHardware方法
/// <summary>
/// 重新加载dll
/// </summary>
/// <returns></returns>
public AjaxResult RefreshHardware()
{
DebugLog("重新加载dll");
//清除之前的加载文件夹
AppDomain.CurrentDomain.ClearPrivatePath();
try
{
AssemblyControl assembly = new AssemblyControl();
//引用文件夹中的dll
string _add1Folder = string.Join(";", Directory.GetDirectories(assembly.PluginsFolder)).Replace(GlobalVar.LocalPath + "\\", "");
string _add2Folder = string.Join(";", Directory.GetDirectories(assembly.RuntimeFolder)).Replace(GlobalVar.LocalPath + "\\", "");
string privatePath = string.Format("{0};{1};{2}", assembly.IncludeFolder, _add1Folder, _add2Folder);
AppDomain.CurrentDomain.AppendPrivatePath(privatePath);
pluginManager.Load();
return AjaxResult.success("成功");
}
catch (Exception ex)
{
_logerror.Error("重新加载dll", ex);
return AjaxResult.error("错误", ex.Message);
}
}
未完待续
很尴尬,少写了一个重要环节xml的相关配置,所以调用插件的初始化和调用功能只能放在完成xml的读取后才能进行。