插件机制

 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
原文地址:https://www.cnblogs.com/huangzewei/p/9406055.html