在MEF中,使用[System.ComponentModel.Composition.ExportAttribute]支持多种级别的导出部件配置,包括类、字段、属性以及方法级别的导出部件,通过查看ExportAttribute的源代码就知道ExportAttribute被定义为Attribute,并为其设置了使用范围。

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes")]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Method,
                AllowMultiple = true, Inherited = false)]
public class ExportAttribute : Attribute
{
  //......
}

  当任何一个类对象或是其内部的字段、属性、方法需要作为可组合部件的时候,就可以使用[ExportAttribute]将其标注为可导出部件。比如需要将一个对象做为可组合部件进行导出(就是类级别的导出),只需要在类上添加[ExportAttribute]就行了,详细的应用可参考《MEF中组合部件(Composable Parts)与契约(Contracts)的基本应用》,下面为演示代码:

[System.ComponentModel.Composition.Export]
public class DBLogger
{
}

  对于字段、属性级别的导出同类是一样的,通样使用[ExportAttribute]进行标注,下面代码块演示了一个完整的属性导入与导出的示例。

namespace MEFTraining.ExmprtImport
{
    public partial class MainPage : UserControl
    {
        [Import("Name")]
        public string BookName { get; set; }

public MainPage()
        {
            InitializeComponent();

CompositionInitializer.SatisfyImports(this);

MessageBox.Show(BookName);
        }
    }

public class BookService
    {
        [Export("Name")]
        public string BookName
        {
            get { return "《MEF程序设计指南》"; }
        }
    }
}

  方法级的导入与导出主要是利用委托实现,既Action或Action<T>,其使用也是非常简单的,无论是方法所需的参数还是返回值,都可以通过匿名委托去实现。如下代码中定义了一个BookService类,里面通过MEF导出了PrintBookName方法,且带有一个字符串类型参数,此时就可以通过匿名委托进行形参的和方法的导出。

public class BookService
{
    [Export(typeof(Action<string>))]
    public void PrintBookName(string name)
    {
        Console.WriteLine(name);
    }
}

  在需要使用到此方法的地方,只需要通过匿名委托的方法对该方法进行导入就可以了,下面的代码是对上面的导出方法的调用示例。

public partial class MethodExportImport : UserControl
{
    [Import(typeof(Action<string>))]
    public Action<string> PrintBookName { get; set; }

public MethodExportImport()
    {
        InitializeComponent();

CompositionInitializer.SatisfyImports(this);

PrintBookName("《MEF程序设计指南》");
    }
}

  另外,MEF也支持继承的导入与导出应用,使用[System.ComponentModel.Composition.InheritedExportAttribute]实现基于继承的导出,其他的和字段、属性、方法级的应用完全一致,下面的代码演示了基于继承的导出与导出应用。

namespace MEFTraining.ExmprtImport
{
    public partial class InheritedExportImport : UserControl
    {
        [Import]
        public IUserServie UService { get; set; }

public InheritedExportImport()
        {
            InitializeComponent();
            CompositionInitializer.SatisfyImports(this);

string name = UService.GetUserName();
        }
    }

[InheritedExport]
    public interface IUserServie
    {
        string GetUserName();
    }
    public class UserService : IUserServie
    {
        public string GetUserName()
        {
            return "张三";
        }
    }
}

  MEF还支持构造方法参数的导入,详细这里就不介绍了,有兴趣的可直接查询MEF英文版程序设计指南介绍。

转载于:https://www.cnblogs.com/PatrickLiu/p/6626068.html

【转】MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)相关推荐

  1. MEF程序设计指南七:使用目录(Catalog)动态装载xap与目录筛选(Filtered Catalog)...

    如果不使用MEF进行托管扩展处理,只有通过WebClient进行程序包的下载.解析.实际上MEF的动态下载的底层实现一样是使用的WebClient,然后利用AggregateCatalog进行动态组合 ...

  2. MEF程序设计指南(转)

    在MEF之前,人们已经提出了许多依赖注入框架来解决应用的扩展性问题,比如OSGI 实现以Spring 等等.在 Microsoft 的平台上,.NET Framework 自身内部包含组件模型和 Sy ...

  3. MEF程序设计指南五:迟延(Lazy)加载导出部件(Export Part)与元数据(Metadata)

    MEF中使用导出与导入,实质上就是对一个对象的实例化的过程,通过MEF的特性降低了对象的直接依赖,从而让系统的设计达到一种高灵活.高扩展性的效果.在具体的设计开发中,存在着某些对象是不需要在系统运行或 ...

  4. 【转】MEF程序设计指南五:迟延(Lazy)加载导出部件(Export Part)与元数据(Metadata)...

    MEF中使用导出与导入,实质上就是对一个对象的实例化的过程,通过MEF的特性降低了对象的直接依赖,从而让系统的设计达到一种高灵活.高扩展性的效果.在具体的设计开发中,存在着某些对象是不需要在系统运行或 ...

  5. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  6. 高质量程序设计指南C/C++阅读笔记

    阅读书籍:<高质量程序设计指南C/C++语言>林锐.韩勇泉著 说明: 本文档为阅读笔记,要求有一定的C/C++基础,属于提高篇 一.软件质量基本概念 功能属性: 1.正确性Correcte ...

  7. 【转贴】对《高质量程序设计指南--C++/C第二版》的探讨

    <高质量程序设计指南--C++/C(第二版)>的读书心得              作者:fang_rk     写这篇文章是出于一个偶尔的原因:读计算机系的女友即将升入研究生三年级,她说 ...

  8. C语言书籍阅读-读书笔记--高质量程序设计指南》--C/C++,林锐

    最近闲下来想找机会参加一些编程比赛锻炼锻炼,可没有一个相关网站可以搜集这些信息,因而自己记录下来: 百度之星,http://star.baidu.com/index/developer.时间07.25 ...

  9. Selenium IDE使用指南四(代码导出)

    入门 您可以通过右键单击测试或套件,选择Export,选择目标语言,然后单击,将测试或套件的测试导出到WebDriver代码Export. 这会将包含导出的目标语言代码的文件保存到浏览器的下载目录中. ...

最新文章

  1. 《因果科学周刊》第3期:因果助力 Stable Learning
  2. 31 道 Java 核心面试题,统统打包给你!
  3. 广东海洋大学微型计算机考试,广东海洋大学2007-2008微型计算机原理及应用
  4. 【公开课预告】:超低延迟下的实时合唱体验升级
  5. UIButton和UIimageView
  6. mac netbeans java_在macOS上不安装JDK的情况下安装Netbeans
  7. python数据可视化-matplotlib之散点图sactter函数详解
  8. 软件详细设计的几个参考模板
  9. 高压油管matlab,高压油管的压力及流量控制
  10. CDR插件开发之GMS插件003 - 编写你的第一个GMS插件
  11. SpringBoot整合Cache缓存技术(二十一)
  12. MDM移动设备管理概述
  13. php后门 佛像,给千年佛像做了个CT,结果好吓人
  14. 从远景论坛上学到的完美激活NERO8 NERO9的经验
  15. Prisma note
  16. 关于java一些星号三角形的实现
  17. 华为正式发布鸿蒙艾,安卓12正式发布,华为掉出首发名单,鸿蒙系统硬扛谷歌苹果...
  18. 开通微信支付分最新教程来了!
  19. android 代码浅黄色,Android工程中让人很不爽的“黄色警告”
  20. 小强ERP:旅游行业的996,还能改变吗?

热门文章

  1. css设置按钮竖直方向居中_button内flex垂直居中竟然不居中的解决
  2. Python入门--while循环
  3. jquery操作文档节点的属性
  4. 围棋人机大战属于计算机在什么方面的应用,《信息技术基础》第一章复习题库...
  5. python语言中print函数的作用_python中print()方法有什么
  6. 试题 15 枚举n-m之间的所有质数(质数)
  7. 2020蓝桥杯校内模拟赛1-5(详细版本,看完就会)
  8. 2018年c++B:换零钞;激光样式(递归法和暴力破解)
  9. Codeforces Round #460 (Div. 2): D. Substring(有向图)
  10. Dijkstral算法--单源最短路