.NET 4.5 MEF 基于约定的编程模型
Managed Extensibility Framework 在.NET 4.5中有若干改进,这些都是源自于开源社区的推动(http://mef.codeplex.com/)。
这改动包括:对泛型类型的支持、多作用域及对基于约定编程模型的支持。
什么样的代码才算是基于约定的呢,其实在MS其它框架中也有所体现,比如ASP.NET MVC中 Url Routing /EF 4.1+的Fluent API的配置方式都可以算做基于约定的。
话说MEF之前是用声明式的Attribute来搞定代码的:
1 class Util 2 { 3 [Import] 4 public SubUtilA A { get; set; } 5 [Import] 6 public SubUtilB B { get; set; } 7 } 8 [Export] 9 class SubUtilA { } 10 [Export] 11 class SubUtilB { }
这样写当然没有什么问题,Attribute的形式看起来也很清爽,但是这样写总会有些问题:
- 扩展更多类型时总是要加上Export和Import的Attribute
- 看起来类不是那么纯了,特别是处女座的同学
那么.NET 4.5中基于约定的模型可以让我们怎么来搞定这俩问题呢?
1 class Util 2 { 3 public SubUtilA A { get; set; } 4 public SubUtilB B { get; set; } 5 } 6 class SubUtilA { } 7 class SubUtilB { }
这些是类型定义,我们不添加Attribute
然后里,我们定义一个约定
1 var builder = new RegistrationBuilder(); 2 builder 3 .ForTypesMatching(c => c.Name.StartsWith("SubUtil")) 4 .Export(); 5 builder 6 .ForType<Util>() 7 .Export() 8 .ImportProperties(c => c.Name.Length == 1);
嗯,导出所有SubUtil开头的类,然后在Util中Import所有长度是1的属性
通过这样简单的规则,在再次添加新的类型的时候就可以不额外添加或改动多余代码了。
当然,这种规则定义还可以更加多彩,有待你发现
ALL Code:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel.Composition; 4 using System.ComponentModel.Composition.Hosting; 5 using System.ComponentModel.Composition.Registration; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 10 namespace ConsoleApplication1 11 { 12 class Program 13 { 14 static void Main(string[] args) 15 { 16 var builder = new RegistrationBuilder(); 17 builder 18 .ForTypesMatching(c => c.Name.StartsWith("SubUtil")) 19 .Export(); 20 builder 21 .ForType<Util>() 22 .Export() 23 .ImportProperties(c => c.Name.Length == 1); 24 var cat = 25 new AssemblyCatalog(typeof(Program).Assembly, builder); 26 var container = new CompositionContainer(cat); 27 28 var u = container.GetExportedValue<Util>(); 29 Console.ReadKey(); 30 31 } 32 } 33 34 class Util 35 { 36 public SubUtilA A { get; set; } 37 public SubUtilB B { get; set; } 38 } 39 class SubUtilA { } 40 class SubUtilB { } 41 42 43 //class Util 44 //{ 45 // [Import] 46 // public SubUtilA A { get; set; } 47 // [Import] 48 // public SubUtilB B { get; set; } 49 //} 50 //[Export] 51 //class SubUtilA { } 52 //[Export] 53 //class SubUtilB { } 54 55 }
转载于:https://www.cnblogs.com/chsword/archive/2012/08/09/MEF_4_5.html
.NET 4.5 MEF 基于约定的编程模型相关推荐
- 计算机系统设计 片上系统 pdf,一种基于过程级编程模型的可重构片上系统设计方法.pdf...
一种基于过程级编程模型的可重构片上系统设计方法.pdf ISSN 11一1777/TP 计算机研究与发展 1000-1239/CN of Researchand Journal Development ...
- 基于事件驱动的编程模型(C++asio网络库相关)
基于事件驱动的编程模型 1.reactor模式:lighttpd,libevent,libev,poco,redis 2.Proactor模式:Asio,locp rector模式简单一点 react ...
- 【转】1.6异步编程:IAsyncResult异步编程模型 (APM)
传送门:异步编程系列目录-- 大部分开发人员,在开发多线程应用程序时,都是使用ThreadPool的QueueUserWorkItem方法来发起一次简单的异步操作.然而,这个技术存在许多限制.最大的问 ...
- 第九节:深究并行编程Parallel类中的三大方法 (For、ForEach、Invoke)和几大编程模型(SPM、APM、EAP、TAP)
一. 并行编程 1. 区分串行编程和串行编程 ①. 串行编程:所谓的串行编程就是单线程的作用下,按顺序执行.(典型代表for循环 下面例子从1-100按顺序执行) ②. 并行编程:充分利用多核cpu的 ...
- 面向大数据处理的数据流编程模型和工具综述
点击上方蓝字关注我们 面向大数据处理的数据流编程模型和工具综述 邹骁锋, 阳王东, 容学成, 李肯立, 李克勤 湖南大学信息科学与工程学院,湖南 长沙 410008 论文引用格式: 邹骁锋, 阳王东, ...
- 深究并行编程Parallel类中的三大方法 (For、ForEach、Invoke)和几大编程模型(SPM、APM、EAP、TAP)
一. 并行编程 1. 区分串行编程和串行编程 ①. 串行编程:所谓的串行编程就是单线程的作用下,按顺序执行.(典型代表for循环 下面例子从1-100按顺序执行) ②. 并行编程:充分利用多核cpu的 ...
- Spring Webflux - 03 Webflux编程模型
文章目录 webflux Annotated Controllers - 基于Spring MVC 注解定义请求的Webflux开发 Functional Endpoints_基于函数式的Webflu ...
- sql编程接收一个集合_T-SQL是基于集合的编程方法的资产
sql编程接收一个集合 介绍 (Introduction) This article is the third and last one of a series of articles that ai ...
- 一种基于CUDA标准的异构并行编程模型开发简介
一种基于CUDA标准的异构并行编程模型开发简介 目录 一.绪论 1.1研究背景及意义 1.2目标平台体系结构简介 二.HPPA基本组成结构 三.编译工具链开发 3.1 拆分工具HPCufe开发 3.2 ...
- java基础篇18-网络编程的常识和基于TCP协议的编程模型
1.网络编程的常识 目前主流的网络通讯软件有:微信.QQ.YY.陌陌.探探.飞信.阿里旺旺.... 在吗? 1.1 七层网络模型 为了保证数据传递的可靠安全等等,ISO(国际标准委员会组 ...
最新文章
- 基础IPsec-remote基本配置
- Oracle提示错误消息ORA-28001: the password has expired
- 光盘刻录大师刻录flac_司法监控视频光盘集中刻录归档方案
- Android性能测试-分析工具
- 【知识发现】基于物品的协同过滤推荐算法python实现
- boost::timer::auto_cpu_timer相关的测试程序
- 访问被拒绝:“microsoft.web.ui.webcontrols”的解决办法
- 【操作系统复习】操作系统的运行机制与体系结构
- AngularJS中页面传参方法
- 基于Python的HTTP接口测试
- 苹果打脸!一直号称注重隐私的苹果为监听Siri 录音事件道歉...
- 配合Opencv2.4.9,CMake3.12.1和VS2010在win10下构建项目踩坑记录
- 【毕业设计】JAVA医药管理系统设计(论文+源代码)
- POJ 1183 反正切函数的应用
- linq操作符:分区操作符
- mysql职业要求_运维职业要求
- 算法笔记练习 题解合集
- MEMS传感市场,美/日/德企占主导地位
- 招商银行软件开发笔试知识汇总
- 员工提出辞职后又不想走了,是否可以反悔
热门文章
- 中国气候变暖绝对是事实
- 用中位数代替平均数来衡量民生指标
- 管理感悟:正确认识自己的工作
- C# 读写txt文件 写txt(IO) TXT追加
- mysql sys cpu_MySQL SYS CPU高的案例分析(一)
- 计算机网络苏州大学题库,苏州大学计算机网络样卷B[计科大类].doc
- python print%s s_python - print(%s's %s is %s. % \) 有具体代码,请问这种怎么解释?
- H5中新增加的一些标签
- 第38条:检查参数的有效性
- MongoDB学习笔记(查询)