您的位置:首页 > 编程语言

.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来搞定代码的:

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 { }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: