C#有很多值得学习的地方,这里我们主要介绍C# EmployeePlug类,包括介绍主程序框架被设计为两个程序集等方面。
插件在EmployeePlug.cs和CustomerPlug.cs中定义。列表三展示了C# EmployeePlug类的部分定义。下面是一些关键点。
1。这个类实现了IPlug接口。由于主程序根本不会知道插件内部的类是如何定义的,这非常重要,主程序需要使用IPlug接口和各个插件通信。这种设计利用了面向对象概念里面的多态性。多态性允许运行时,可以通过指向基类的引用,来调用实现派生类中的方法。
2。这个类被两个属性标识,这样主程序可以判断这个插件是不是有效的。在C#中,要给一个类标识一个属性,你得在类的定义之前声明属性,内容附在括号内。
3。简明起见,例子只是使用了直接写入代码的数据。而如果这个插件是个正式的产品,那么数据总是应该放在数据库中或者文件中,各自所有的数据都应该仅仅由插件本身来管理。C# EmployeePlug类的数据在这里用EmployeeData对象来存储,那也是一个类型并且实现了IPlugData接口。IPlugData接口在IPlugData.cs中定义,它提供了最基础的数据交换功能,用于主程序和插件之间的通讯。所有支持IPlugData接口的对象在下层数据变化的时候将提供一个通知。这个通知实际上就是DataChanged事件的发生。
4。当主程序需要显示某个插件所含数据列表的时候,它会调用GetData方法。这个方法返回IPlugData对象的一个数组。这样主程序就可以对数组中的每个对象使用ToString方法得到数据以建立树的各个节点。ToString方法是EmployeeData类的一个重载,用于显示雇员的名字。
5。IPlug接口也定义了Save和Print方法。定义这两个方法的目的在于当有需要打印或者保存数据的时候,要通知一个插件。EmployeePlug 类就是用于实现打印和保存数据的功能的。在使用Save方法的时候,需要保存数据的位置将会在方法调用的时候提供。这里假设主程序会向用户查询路径等信息。路径信息的查询是主程序提供给各个插件的服务。对于Print方法,主程序将把选项和内容传递到
System。Drawing。Printing。PrintDocument类的实例。这两种情况下,和用户的交互操作都是一致的由主程序提供的。
主程序框架被设计为两个程序集。***个程序集是Host.exe,它提供了主程序的Windows窗体界面。第二个程序集是HostCommon.dll,它提供了主程序和插件之间进行通信所需的所有类型定义。比如,IPlug接口就是在 HostCommon.dll里面配置的,这样它可以被主程序和插件等价的访问。这两个程序集在一个文件夹内,同样的,附加的作为插件的程序集也需要被配置在一起。那些程序集被配置在plugs文件夹内(主程序目录的一个子文件夹)。C# EmployeePlug类在Employee.plug 程序集中定义,而CustomerPlug类在Customer.plug程序集中定义。这个例子指定插件文件以.plug为扩展名。事实上这些插件就是个普通的.NET类库文件,只是通常库文件使用.dll扩展名,这里用.plug罢了。特殊的扩展名对于程序运行是完全没有影响的,但是它可以让用户更明确的知道这是个插件文件。
【编辑推荐】