.NET 4.5 MEF 基于约定的编程模型

简介: Managed Extensibility Framework 在.NET 4.5中有若干改进,这些都是源自于开源社区的推动(http://mef.codeplex.com/)。 这改动包括:对泛型类型的支持、多作用域及对基于约定编程模型的支持。

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

 

 

相关文章
Visual Studio编程效率提升技巧集(提高.NET编程效率)
Visual Studio编程效率提升技巧集(提高.NET编程效率)
163 0
Visual Studio编程效率提升技巧集(提高.NET编程效率)
D1net阅闻|据悉微软致力于在365 Copilot产品中添加非OpenAI模型
D1net阅闻|据悉微软致力于在365 Copilot产品中添加非OpenAI模型
D1net阅闻 | 李飞飞团队训练出媲美DeepSeek R1的推理模型 云计算费用不到50美元
D1net阅闻 | 李飞飞团队训练出媲美DeepSeek R1的推理模型 云计算费用不到50美元
D1net阅闻 | ChatGPT支持所有用户使用搜索功能之时,谷歌也开放了最强模型
D1net阅闻 | ChatGPT支持所有用户使用搜索功能之时,谷歌也开放了最强模型
D1net阅闻|谷歌被曝正使用Anthropic的Claude模型来改进其Gemini AI
D1net阅闻|谷歌被曝正使用Anthropic的Claude模型来改进其Gemini AI
探索.NET nanoFramework:为嵌入式设备编程的新途径
探索.NET nanoFramework:为嵌入式设备编程的新途
145 7
从零到英雄:.NET核心技术带你踏上编程之旅,构建首个应用,开启你的数字世界探险!
【8月更文挑战第28天】本文带领读者从零开始,使用强大的.NET平台搭建首个控制台应用。无论你是新手还是希望扩展技能的开发者,都能通过本文逐步掌握.NET的核心技术。从环境搭建到创建项目,再到编写和运行代码,详细步骤助你轻松上手。通过计算两数之和的小项目,你不仅能快速入门,还能为未来开发更复杂的应用奠定基础。希望本文为你的.NET学习之旅开启新篇章!
58 1
|
6月前
|
揭秘C#.Net编程秘宝:结构体类型Struct,让你的数据结构秒变高效战斗机,编程界的新星就是你!
【8月更文挑战第4天】在C#编程中,结构体(`struct`)是一种整合多种数据类型的复合数据类型。与类不同,结构体是值类型,意味着数据被直接复制而非引用。这使其适合表示小型、固定的数据结构如点坐标。结构体默认私有成员且不可变,除非明确指定。通过`struct`关键字定义,可以包含字段、构造函数及方法。例如,定义一个表示二维点的结构体,并实现计算距离原点的方法。使用时如同普通类型,可通过实例化并调用其成员。设计时推荐保持结构体不可变以避免副作用,并注意装箱拆箱可能导致的性能影响。掌握结构体有助于构建高效的应用程序。
203 7
Spring 框架里竟藏着神秘魔法?国际化与本地化的奇妙之旅等你来揭开谜底!
【8月更文挑战第31天】在软件开发中,国际化(I18N)与本地化(L10N)对于满足不同地区用户需求至关重要。Spring框架提供了强大支持,利用资源文件和`MessageSource`实现多语言文本管理。通过配置日期格式和货币符号,进一步完善本地化功能。合理应用这些特性,可显著提升应用的多地区适应性和用户体验。
68 0
探索未来:.NET nanoFramework引领嵌入式设备编程革新之旅
【8月更文挑战第28天】.NET nanoFramework 是一款专为资源受限的嵌入式设备设计的轻量级、高性能框架,基于 .NET Core,采用 C# 进行开发,简化了传统底层硬件操作的复杂性,极大提升了开发效率。开发者可通过 Visual Studio 或 Visual Studio Code 快速搭建环境并创建项目,利用丰富的库和驱动程序轻松实现从基础 LED 控制到网络通信等多种功能,显著降低了嵌入式开发的门槛。
127 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等