硬件管理平台-硬件网关-插件模块-集成(上)

硬件管理平台-硬件网关-插件模块-集成(上)

本章内容

本章主要是将插件项目(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功能进行操作。

该服务主要功能:

  1. 初始化ini配置文件
  2. 调用插件项目的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中添加对配置文件的操作:

  1. 添加一个IniSetting的变量声明
  2. 在构造函数中给该变量赋值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的读取后才能进行。

posted @ 2023-08-12 17:34  摧残一生  阅读(23)  评论(0编辑  收藏  举报