WPF中MEF的简单使用

在用WPF MVVMLight做毕设的过程中,偶然看到关于MEF插件式开发的技术文章,就想试试看能不能把每个模块做成插件。

****
我原先想实现的功能就是一个模块就是一个插件,所有插件加载到主界面的TreeView导航中,点击对应的项,显示对应的页面,而TreeView的集合并非我手动一个一个new TreeViewItem 是根据每个页面的元数据来生成

后来我也确实部分实现了这个小需求,但是不能做成无限极树,而且在用CustomExportMetadata设置元数据时也非常不合理,只能删掉然后一个一个new TreeViewItem了 (╯‵□′)╯︵┻━┻(菜鸡的无能狂怒)
****

先来看看简陋的效果图(啥也看不出来)

qvPj42p.png

然后看下项目结构

fOktAMe.png

  • Core 核心接口库,想要让我加载你的插件,你就必须遵守我的规则
  • Plugins 用户控件库,插件
  • MvvmLight.MEF 主程序加载插件

****MEF需要用到的dll****

  • System.ComponentModel.Composition
  • System.ComponentModel.Composition.Hosting

****注意****

插件没加载进去先看看查找插件dll的路径对不对

  1. 在Core类库中定义一个视图IView接口

     public interface IView
     {
         //约束插件类型
                     //我并不关心你的class叫什么名字,我只需要知道谁继承了这个接口,然后我就可以转换成IView类型的。
                     //这难道就是传说中的面向接口编程?
     }
  2. 定义一个元数据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; }
  3. 实现元数据接口的特性

     [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; }
         /
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值