在看本文章之前,需了解 反射技术 和面向对象基本思想!
当业务需求不断变化, 为了项目更好的扩展,我们便需要一种可以动态加载的技术。
实现插件式开发主要分为3步
1 定义接口
2 加载插件
3 编写插件
实例程序
步骤1 :
创建一个类库项目,取名为Plguin
创建一个接口IPlugin
using System;
using System.Collections.Generic;
namespace Plguin
{
public enum Function
{
Text=0, //文本值
Bool=1 //bool值
}
public interface IPlugin
{
public String GetName();
/// <summary>
/// 获取一个功能列表
/// </summary>
/// <returns></returns>
public Function[] GetFunction();
/// <summary>
/// 执行
/// </summary>
public void Execute(List<String> val);
}
}
步骤2 在程序中加载dll
1 在项目中创建一个plugin 文件夹 用来保存插件
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Threading.Channels;
using Plguin;
namespace IotPlugin
{
class Program
{
static void Main(string[] args)
{
IotStart start=new IotStart();
start.Start();
}
}
class IotStart
{
public IotStart()
{
loadPlugin();
}
public Dictionary<String,IPlugin> ListName=new Dictionary<String,IPlugin>();
public void loadPlugin()
{
String fileName = "../../../Plugin/";
// 获取所有文件
DirectoryInfo info=new DirectoryInfo(fileName);
FileInfo[] files=info.GetFiles();
for (int i = 0; i < files.Length; i++)
{
Assembly assembly= Assembly.LoadFile(files[i].FullName);
// 创建实例
IPlugin plugin= assembly.CreateInstance(assembly.GetName().Name+"."+assembly.GetTypes()[0].Name) as IPlugin;if (plugin==null)
{
throw new Exception("插件错误请检查插件!!!!");
}
ListName.Add(plugin.GetName(),plugin);
}
}
public void Start()
{
Console.WriteLine("-==================按键选择========================================");
Console.WriteLine("1--请选择设备");
Console.WriteLine("2--刷新插件");
int switchVal =int.Parse(Console.ReadLine());
switch (switchVal)
{
case 1: Swich();
break;
case 2 :
loadPlugin();
break;;
}
}
public void Swich()
{
Console.WriteLine("输入名称选择设备");
foreach (var VARIABLE in ListName.Keys)
{
Console.WriteLine($"----{VARIABLE}");
}
ShowList(Console.ReadLine());
}
public void ShowList(String val)
{
List<String> list=new List<string>();
IPlugin plugin = ListName[val];
foreach (var VARIABLE in plugin.GetFunction())
{
Console.WriteLine("请输入值:");
list.Add(Console.ReadLine());
}
plugin.Execute(list);
}
}
}
3 编写一个插件
注意!每一个插件都应该是一个单独的程序集 并且需要引用plugin 程序集
using System;
using System.Collections.Generic;
using Plguin;
namespace XiaoMiPlguin
{
public class XiaoMiPlguin: IPlugin
{
public string GetName()
{
return "设备1";
}
public Function[] GetFunction()
{
Function[] func = new[]
{
Function.Text,
Function.Text
};
return func;
}
public void Execute(List<string> val)
{Dictionary<String,String> dic=new Dictionary<String,String>();
dic.Add("F2_temper","");
dic.Add("F3_temper","");
if (val.Count!=dic.Count)
{
throw new Exception("参数长度错误");
}
int index = 0;
foreach (String key in dic.Keys)
{
if (val[index]=="")
{
continue;
}
dic[key] = val[index];
index += 1;
}
{
Console.WriteLine("正在发生请求==========================");
//模拟发生请求的过程
foreach (var VARIABLE in dic.Keys)
{
Console.WriteLine(VARIABLE+":"+dic[VARIABLE]);
}
Console.WriteLine("请求发生成功=========================");
}
}
}
}