.NET 4.5 MEF 基于约定的编程模型
2012-08-09 13:31
344 查看
Managed Extensibility Framework 在.NET 4.5中有若干改进,这些都是源自于开源社区的推动(http://mef.codeplex.com/)。
这改动包括:对泛型类型的支持、多作用域及对基于约定编程模型的支持。
什么样的代码才算是基于约定的呢,其实在MS其它框架中也有所体现,比如ASP.NET MVC中 Url Routing /EF 4.1+的Fluent API的配置方式都可以算做基于约定的。
话说MEF之前是用声明式的Attribute来搞定代码的:
这样写当然没有什么问题,Attribute的形式看起来也很清爽,但是这样写总会有些问题:
扩展更多类型时总是要加上Export和Import的Attribute
看起来类不是那么纯了,特别是处女座的同学
那么.NET 4.5中基于约定的模型可以让我们怎么来搞定这俩问题呢?
这些是类型定义,我们不添加Attribute
然后里,我们定义一个约定
嗯,导出所有SubUtil开头的类,然后在Util中Import所有长度是1的属性
通过这样简单的规则,在再次添加新的类型的时候就可以不额外添加或改动多余代码了。
当然,这种规则定义还可以更加多彩,有待你发现
ALL Code:
View Code
这改动包括:对泛型类型的支持、多作用域及对基于约定编程模型的支持。
什么样的代码才算是基于约定的呢,其实在MS其它框架中也有所体现,比如ASP.NET MVC中 Url Routing /EF 4.1+的Fluent API的配置方式都可以算做基于约定的。
话说MEF之前是用声明式的Attribute来搞定代码的:
class Util { [Import] public SubUtilA A { get; set; } [Import] public SubUtilB B { get; set; } } [Export] class SubUtilA { } [Export] class SubUtilB { }
这样写当然没有什么问题,Attribute的形式看起来也很清爽,但是这样写总会有些问题:
扩展更多类型时总是要加上Export和Import的Attribute
看起来类不是那么纯了,特别是处女座的同学
那么.NET 4.5中基于约定的模型可以让我们怎么来搞定这俩问题呢?
class Util { public SubUtilA A { get; set; } public SubUtilB B { get; set; } } class SubUtilA { } class SubUtilB { }
这些是类型定义,我们不添加Attribute
然后里,我们定义一个约定
var builder = new RegistrationBuilder(); builder .ForTypesMatching(c => c.Name.StartsWith("SubUtil")) .Export(); builder .ForType<Util>() .Export() .ImportProperties(c => c.Name.Length == 1);
嗯,导出所有SubUtil开头的类,然后在Util中Import所有长度是1的属性
通过这样简单的规则,在再次添加新的类型的时候就可以不额外添加或改动多余代码了。
当然,这种规则定义还可以更加多彩,有待你发现
ALL Code:
View Code
using System; using System.Collections.Generic; using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; using System.ComponentModel.Composition.Registration; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { var builder = new RegistrationBuilder(); builder .ForTypesMatching(c => c.Name.StartsWith("SubUtil")) .Export(); builder .ForType<Util>() .Export() .ImportProperties(c => c.Name.Length == 1); var cat = new AssemblyCatalog(typeof(Program).Assembly, builder); var container = new CompositionContainer(cat); var u = container.GetExportedValue<Util>(); Console.ReadKey(); } } class Util { public SubUtilA A { get; set; } public SubUtilB B { get; set; } } class SubUtilA { } class SubUtilB { } //class Util //{ // [Import] // public SubUtilA A { get; set; } // [Import] // public SubUtilB B { get; set; } //} //[Export] //class SubUtilA { } //[Export] //class SubUtilB { } }
相关文章推荐
- .NET 4.5 MEF 基于约定的编程模型---重典
- .Net插件编程模型:MEF和MAF
- .Net插件编程模型:MEF和MAF
- 基于.NET平台的Windows编程实战(六)—— 题目管理功能的实现
- 基于.NET平台的Windows编程实战(九)— 安装与部署
- 基于SOA的编程模型
- atitit.基于组件的事件为基础的编程模型--服务器端控件(1)---------服务器端控件和标签之间的关系
- 艾伟:基于.NET平台的Windows编程实战(一)——前言
- 艾伟_转载:基于.NET平台的Windows编程实战(四)—— 数据库操作类的编写
- 基于.NET平台的Windows编程实战(二)—— 需求分析与数据库设计
- 基于.NET平台的Windows编程实战(八)— 数据库管理及其他辅助功能的实现
- 云巴:基于 MQTT 协议的实时通信编程模型
- 基于hadoop创建lucene索引(一)编程模型一
- .NET 一致的编程模型
- 艾伟:基于.NET平台的Windows编程实战(四)—— 数据库操作类的编写
- 多进程并发编程----基于高级的预先创建进程池(accept不上锁)的模型
- 一起谈.NET技术,ASP.NET应用下基于SessionState的“状态编程框架”解决方案
- 基于.NET平台的Windows编程实战(七)—— 问卷统计功能的实现
- .NET数据库编程求索之路--6.使用ADO.NET实现(三层架构篇-使用List传递数据-基于存储过程)(2)
- 基于python yield机制的异步操作同步化编程模型