在用WPF MVVMLight做毕设的过程中,偶然看到关于MEF插件式开发的技术文章,就想试试看能不能把每个模块做成插件。
****
我原先想实现的功能就是一个模块就是一个插件,所有插件加载到主界面的TreeView导航中,点击对应的项,显示对应的页面,而TreeView的集合并非我手动一个一个new TreeViewItem 是根据每个页面的元数据来生成
后来我也确实部分实现了这个小需求,但是不能做成无限极树,而且在用CustomExportMetadata设置元数据时也非常不合理,只能删掉然后一个一个new TreeViewItem了 (╯‵□′)╯︵┻━┻(菜鸡的无能狂怒)
****
先来看看简陋的效果图(啥也看不出来)
然后看下项目结构
- Core 核心接口库,想要让我加载你的插件,你就必须遵守我的规则
- Plugins 用户控件库,插件
- MvvmLight.MEF 主程序加载插件
****MEF需要用到的dll****
- System.ComponentModel.Composition
- System.ComponentModel.Composition.Hosting
****注意****
插件没加载进去先看看查找插件dll的路径对不对
在Core类库中定义一个视图IView接口
public interface IView { //约束插件类型 //我并不关心你的class叫什么名字,我只需要知道谁继承了这个接口,然后我就可以转换成IView类型的。 //这难道就是传说中的面向接口编程? }
定义一个元数据IMetaData接口 (根据你的需要定义元数据)
/// <summary> /// 优先级 /// </summary> [DefaultValue(0)] int Priority { get; } /// <summary> /// 名称(不能重复) /// </summary> string Name { get; } /// <summary> /// 描述 /// </summary> string Description { get; } /// <summary> /// 作者 /// </summary> string Author { get; } /// <summary> /// 版本 /// </summary> string Version { get; }
实现元数据接口的特性
[MetadataAttribute] [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] public class CustomExportMetadata : ExportAttribute, IMetaData { /// <summary> /// 优先级 /// </summary> public int Priority { get; private set; } /// <summary> /// 名称 /// </summary> public string Name { get; private set; } /