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的形式看起来也很清爽,但是这样写总会有些问题:

  1. 扩展更多类型时总是要加上Export和Import的Attribute
  2. 看起来类不是那么纯了,特别是处女座的同学

那么.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:

View 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 基于约定的编程模型相关推荐

  1. 计算机系统设计 片上系统 pdf,一种基于过程级编程模型的可重构片上系统设计方法.pdf...

    一种基于过程级编程模型的可重构片上系统设计方法.pdf ISSN 11一1777/TP 计算机研究与发展 1000-1239/CN of Researchand Journal Development ...

  2. 基于事件驱动的编程模型(C++asio网络库相关)

    基于事件驱动的编程模型 1.reactor模式:lighttpd,libevent,libev,poco,redis 2.Proactor模式:Asio,locp rector模式简单一点 react ...

  3. 【转】1.6异步编程:IAsyncResult异步编程模型 (APM)

    传送门:异步编程系列目录-- 大部分开发人员,在开发多线程应用程序时,都是使用ThreadPool的QueueUserWorkItem方法来发起一次简单的异步操作.然而,这个技术存在许多限制.最大的问 ...

  4. 第九节:深究并行编程Parallel类中的三大方法 (For、ForEach、Invoke)和几大编程模型(SPM、APM、EAP、TAP)

    一. 并行编程 1. 区分串行编程和串行编程 ①. 串行编程:所谓的串行编程就是单线程的作用下,按顺序执行.(典型代表for循环 下面例子从1-100按顺序执行) ②. 并行编程:充分利用多核cpu的 ...

  5. 面向大数据处理的数据流编程模型和工具综述

    点击上方蓝字关注我们 面向大数据处理的数据流编程模型和工具综述 邹骁锋, 阳王东, 容学成, 李肯立, 李克勤 湖南大学信息科学与工程学院,湖南 长沙 410008 论文引用格式: 邹骁锋, 阳王东, ...

  6. 深究并行编程Parallel类中的三大方法 (For、ForEach、Invoke)和几大编程模型(SPM、APM、EAP、TAP)

    一. 并行编程 1. 区分串行编程和串行编程 ①. 串行编程:所谓的串行编程就是单线程的作用下,按顺序执行.(典型代表for循环 下面例子从1-100按顺序执行) ②. 并行编程:充分利用多核cpu的 ...

  7. Spring Webflux - 03 Webflux编程模型

    文章目录 webflux Annotated Controllers - 基于Spring MVC 注解定义请求的Webflux开发 Functional Endpoints_基于函数式的Webflu ...

  8. sql编程接收一个集合_T-SQL是基于集合的编程方法的资产

    sql编程接收一个集合 介绍 (Introduction) This article is the third and last one of a series of articles that ai ...

  9. 一种基于CUDA标准的异构并行编程模型开发简介

    一种基于CUDA标准的异构并行编程模型开发简介 目录 一.绪论 1.1研究背景及意义 1.2目标平台体系结构简介 二.HPPA基本组成结构 三.编译工具链开发 3.1 拆分工具HPCufe开发 3.2 ...

  10. java基础篇18-网络编程的常识和基于TCP协议的编程模型

    1.网络编程的常识   目前主流的网络通讯软件有:微信.QQ.YY.陌陌.探探.飞信.阿里旺旺....   在吗?  1.1 七层网络模型   为了保证数据传递的可靠安全等等,ISO(国际标准委员会组 ...

最新文章

  1. 基础IPsec-remote基本配置
  2. Oracle提示错误消息ORA-28001: the password has expired
  3. 光盘刻录大师刻录flac_司法监控视频光盘集中刻录归档方案
  4. Android性能测试-分析工具
  5. 【知识发现】基于物品的协同过滤推荐算法python实现
  6. boost::timer::auto_cpu_timer相关的测试程序
  7. 访问被拒绝:“microsoft.web.ui.webcontrols”的解决办法
  8. 【操作系统复习】操作系统的运行机制与体系结构
  9. AngularJS中页面传参方法
  10. 基于Python的HTTP接口测试
  11. 苹果打脸!一直号称注重隐私的苹果为监听Siri 录音事件道歉...
  12. 配合Opencv2.4.9,CMake3.12.1和VS2010在win10下构建项目踩坑记录
  13. 【毕业设计】JAVA医药管理系统设计(论文+源代码)
  14. POJ 1183 反正切函数的应用
  15. linq操作符:分区操作符
  16. mysql职业要求_运维职业要求
  17. 算法笔记练习 题解合集
  18. MEMS传感市场,美/日/德企占主导地位
  19. 招商银行软件开发笔试知识汇总
  20. 员工提出辞职后又不想走了,是否可以反悔

热门文章

  1. 中国气候变暖绝对是事实
  2. 用中位数代替平均数来衡量民生指标
  3. 管理感悟:正确认识自己的工作
  4. C# 读写txt文件 写txt(IO) TXT追加
  5. mysql sys cpu_MySQL SYS CPU高的案例分析(一)
  6. 计算机网络苏州大学题库,苏州大学计算机网络样卷B[计科大类].doc
  7. python print%s s_python - print(%s's %s is %s. % \) 有具体代码,请问这种怎么解释?
  8. H5中新增加的一些标签
  9. 第38条:检查参数的有效性
  10. MongoDB学习笔记(查询)