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

  1. 扩展更多类型时总是要加上ExportImportAttribute
  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开头的类,然后在UtilImport所有长度是1的属性

通过这样简单的规则,在再次添加新的类型的时候就可以不额外添加或改动多余代码了。

当然,这种规则定义还可以更加多彩,有待你发现

ALL Code:

View Code

 

标签: MEF
原文地址:https://www.cnblogs.com/Leo_wl/p/2630380.html