【转】MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)
在MEF中,使用[System.ComponentModel.Composition.ExportAttribute]支持多种级别的导出部件配置,包括类、字段、属性以及方法级别的导出部件,通过查看ExportAttribute的源代码就知道ExportAttribute被定义为Attribute,并为其设置了使用范围。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Method,
AllowMultiple = true, Inherited = false)]
public class ExportAttribute : Attribute
{
//......
}
当任何一个类对象或是其内部的字段、属性、方法需要作为可组合部件的时候,就可以使用[ExportAttribute]将其标注为可导出部件。比如需要将一个对象做为可组合部件进行导出(就是类级别的导出),只需要在类上添加[ExportAttribute]就行了,详细的应用可参考《MEF中组合部件(Composable Parts)与契约(Contracts)的基本应用》,下面为演示代码:
public class DBLogger
{
}
对于字段、属性级别的导出同类是一样的,通样使用[ExportAttribute]进行标注,下面代码块演示了一个完整的属性导入与导出的示例。
{
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方法,且带有一个字符串类型参数,此时就可以通过匿名委托进行形参的和方法的导出。
{
[Export(typeof(Action<string>))]
public void PrintBookName(string name)
{
Console.WriteLine(name);
}
}
在需要使用到此方法的地方,只需要通过匿名委托的方法对该方法进行导入就可以了,下面的代码是对上面的导出方法的调用示例。
{
[Import(typeof(Action<string>))]
public Action<string> PrintBookName { get; set; }
public MethodExportImport()
{
InitializeComponent();
CompositionInitializer.SatisfyImports(this);
PrintBookName("《MEF程序设计指南》");
}
}
另外,MEF也支持继承的导入与导出应用,使用[System.ComponentModel.Composition.InheritedExportAttribute]实现基于继承的导出,其他的和字段、属性、方法级的应用完全一致,下面的代码演示了基于继承的导出与导出应用。
{
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)相关推荐
- MEF程序设计指南七:使用目录(Catalog)动态装载xap与目录筛选(Filtered Catalog)...
如果不使用MEF进行托管扩展处理,只有通过WebClient进行程序包的下载.解析.实际上MEF的动态下载的底层实现一样是使用的WebClient,然后利用AggregateCatalog进行动态组合 ...
- MEF程序设计指南(转)
在MEF之前,人们已经提出了许多依赖注入框架来解决应用的扩展性问题,比如OSGI 实现以Spring 等等.在 Microsoft 的平台上,.NET Framework 自身内部包含组件模型和 Sy ...
- MEF程序设计指南五:迟延(Lazy)加载导出部件(Export Part)与元数据(Metadata)
MEF中使用导出与导入,实质上就是对一个对象的实例化的过程,通过MEF的特性降低了对象的直接依赖,从而让系统的设计达到一种高灵活.高扩展性的效果.在具体的设计开发中,存在着某些对象是不需要在系统运行或 ...
- 【转】MEF程序设计指南五:迟延(Lazy)加载导出部件(Export Part)与元数据(Metadata)...
MEF中使用导出与导入,实质上就是对一个对象的实例化的过程,通过MEF的特性降低了对象的直接依赖,从而让系统的设计达到一种高灵活.高扩展性的效果.在具体的设计开发中,存在着某些对象是不需要在系统运行或 ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- 高质量程序设计指南C/C++阅读笔记
阅读书籍:<高质量程序设计指南C/C++语言>林锐.韩勇泉著 说明: 本文档为阅读笔记,要求有一定的C/C++基础,属于提高篇 一.软件质量基本概念 功能属性: 1.正确性Correcte ...
- 【转贴】对《高质量程序设计指南--C++/C第二版》的探讨
<高质量程序设计指南--C++/C(第二版)>的读书心得 作者:fang_rk 写这篇文章是出于一个偶尔的原因:读计算机系的女友即将升入研究生三年级,她说 ...
- C语言书籍阅读-读书笔记--高质量程序设计指南》--C/C++,林锐
最近闲下来想找机会参加一些编程比赛锻炼锻炼,可没有一个相关网站可以搜集这些信息,因而自己记录下来: 百度之星,http://star.baidu.com/index/developer.时间07.25 ...
- Selenium IDE使用指南四(代码导出)
入门 您可以通过右键单击测试或套件,选择Export,选择目标语言,然后单击,将测试或套件的测试导出到WebDriver代码Export. 这会将包含导出的目标语言代码的文件保存到浏览器的下载目录中. ...
最新文章
- 《因果科学周刊》第3期:因果助力 Stable Learning
- 31 道 Java 核心面试题,统统打包给你!
- 广东海洋大学微型计算机考试,广东海洋大学2007-2008微型计算机原理及应用
- 【公开课预告】:超低延迟下的实时合唱体验升级
- UIButton和UIimageView
- mac netbeans java_在macOS上不安装JDK的情况下安装Netbeans
- python数据可视化-matplotlib之散点图sactter函数详解
- 软件详细设计的几个参考模板
- 高压油管matlab,高压油管的压力及流量控制
- CDR插件开发之GMS插件003 - 编写你的第一个GMS插件
- SpringBoot整合Cache缓存技术(二十一)
- MDM移动设备管理概述
- php后门 佛像,给千年佛像做了个CT,结果好吓人
- 从远景论坛上学到的完美激活NERO8 NERO9的经验
- Prisma note
- 关于java一些星号三角形的实现
- 华为正式发布鸿蒙艾,安卓12正式发布,华为掉出首发名单,鸿蒙系统硬扛谷歌苹果...
- 开通微信支付分最新教程来了!
- android 代码浅黄色,Android工程中让人很不爽的“黄色警告”
- 小强ERP:旅游行业的996,还能改变吗?
热门文章
- css设置按钮竖直方向居中_button内flex垂直居中竟然不居中的解决
- Python入门--while循环
- jquery操作文档节点的属性
- 围棋人机大战属于计算机在什么方面的应用,《信息技术基础》第一章复习题库...
- python语言中print函数的作用_python中print()方法有什么
- 试题 15 枚举n-m之间的所有质数(质数)
- 2020蓝桥杯校内模拟赛1-5(详细版本,看完就会)
- 2018年c++B:换零钞;激光样式(递归法和暴力破解)
- Codeforces Round #460 (Div. 2): D. Substring(有向图)
- Dijkstral算法--单源最短路