1 #region 插件机制
2 // 宿主(host):程序寄宿或挂载对象
3 // 有了宿主就可以定义插件(plug-in):符合指定宿主某种接口,并能够提供特定功能的程序
4
5 // 插件架构(插件机制):它降低了宿主与具体的应用模块的依赖,宿主不关心每一个具体的插件如何实现,
6 // 只要该插件满足宿主的规范,那么宿主就能够加载它。
7 // 作为插件,只要满足了宿主的规范便可以被宿主加载
8
9 // 使用插件架构时一般都会使用到 反射(reflector)
10
11 // 规范 在实际编码中体现为 Interface 或者 abstract class
12
13 // 1.定义一个接口
14 /// <summary>
15 /// 插件应遵循的接口
16 /// </summary>
17 public interface IPlugIn{
18 void Show();
19 }
20
21 // 2.定义一个插件,需要实现上述接口
22 /// <summary>
23 /// 具体插件
24 /// </summary>
25 public class MyPlugIn : IPlugIn
26 {
27 // IPlugIn 成员
28 public void Show()
29 {
30 Console.WriteLine("this is my plugin");
31 }
32 }
33
34 // 定义一个 宿主 ,并利用 反射 创建具体插件的实例
35 public class PlugInHost
36 {
37 /// <summary>
38 /// 加载所有的插件
39 /// </summary>
40 /// <returns></returns>
41 public List<IPlugIn> LoadPlugIns()
42 {
43 List<IPlugIn> plugList = new List<IPlugIn>();
44 Assembly pluginAssembly = null;
45 string path = System.IO.Directory.GetCurrentDirectory() + "/plugins/MyPlugin.dll";
46 try
47 {
48 // 加载程序集
49 pluginAssembly = Assembly.LoadFile(path);
50 }
51 catch (Exception ex)
52 {
53
54 Console.WriteLine(ex.Message);
55 return plugList;
56 }
57
58 Type[] types = pluginAssembly.GetTypes();
59 foreach (Type type in types)
60 {
61 if (type.GetInterface("IPlugIn") != null)
62 {
63 // 创建插件的实例
64 plugList.Add((IPlugIn)Activator.CreateInstance(type));
65 }
66 }
67
68 return plugList;
69 }
70 }
71
72 // 定义完了插件,扩展规则,宿主之后调用
73 static void Main(string[] args)
74 {
75 PlugInHost host = new PlugInHost();
76 var plugins = host.LoadPlugIns();
77 foreach (var plugin in plugins)
78 {
79 plugin.Show();
80 }
81
82 Console.Read();
83 }
84
85 #endregion