理解 MEF
1、它解决什么问题?
考虑下面的需求,甲程序员对外暴露接口,内部提供实现。乙程序员使用甲提供的接口,根据面向接口编程的原则,乙关联一个接口类型的引用。正常情况下,乙要使用甲的实现,必须实例化一个具体对象。有没有更好的办法呢?我们知道Java框架spring中有个依赖注入的概念。C#中能不能使用类似的方式呢?
2、怎么解决?
使用MEF(Managed Extensibility Framework),示例如下:
namespace TestMEF
{
public interface IBookService
{
void GetBookName();
} [Export(typeof(IBookService))]
public class ComputerBookService : IBookService
{
public void GetBookName()
{
Console.WriteLine("Computer Book");
}
} [Export(typeof(IBookService))]
public class EnglishBookService : IBookService
{
public void GetBookName()
{
Console.WriteLine("English Book");
}
} class Program
{
//[Import]
//public IBookService Service { get; set; } [ImportMany]
public List<IBookService> ServiceList { get; set; } private void Compose()
{
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
} static void Main(string[] args)
{
Program p = new Program();
p.Compose(); //p.Service.GetBookName(); foreach (IBookService service in p.ServiceList)
{
service.GetBookName();
} Console.ReadLine();
}
}
}
说明:有一个实现,使用者那里期望public IBookService Service,有多个实现,使用者期望public List<IBookService> ServiceList 。
3、通过这个示例,更加深刻理解。软件的本质就是封装,操作系统封装硬件,高级编程语言封装操作系统,应用软件封装高级语言,应用软件暴露UI接口给用户使用。软件本质就是封装,对已有的实现进行封装,暴露出更容易的接口。程序员本身是软件开发者,也是软件使用者,使用其他程序员提供的接口,别人提供的接口也可以认为是一个软件。
理解 MEF的更多相关文章
- C#进阶系列——MEF实现设计上的“松耦合”(一)
前言:最近去了趟外地出差,介绍推广小组开发的框架类产品.推广对象是本部门在项目上面的同事——1到2年工作经验的初级程序员.在给他们介绍框架时发现很多框架设计层面的知识他们都没有接触过,甚至没听说过,这 ...
- MEF 编程指南(九):部件生命周期
理解 MEF 容器部件生命周期和实现是非常重要的事情.考虑到 MEF 关注可扩展应用程序.这变得尤为重要.生命期可以解释为期望部件的共享性(transitively, its exports) 共 ...
- MEF学习笔记
之前公司里用到了一个叫MEF的东西,说来惭愧一直只管写代码却不曾理解MEF框架为何物,今天就来学习一下,这是一篇迟到了不知多久的博客. -------------------------------- ...
- 再看IOC, 读深入理解DIP、IoC、DI以及IoC容器
IoC则是一种 软件设计模式,它告诉你应该如何做,来解除相互依赖模块的耦合.控制反转(IoC),它为相互依赖的组件提供抽象,将依赖(低层模块)对象的获得交给第三方(系统)来控制,即依赖对象不在被依赖模 ...
- MEF初体验之九:部件生命周期
理解MEF容器中部件的生命周期及其含义是非常重要的.鉴于MEF重点在开放端应用程序,这将变得尤其重要的,一旦app ships和第三方扩展开始运行,作为应用程序的开发者将很好地控制这一系列的部件.生命 ...
- MEF 基础简介 四
前言 前面讲解了MEF的引用方法,接口的导入导出,类属性的导入导出和集合的导出用法其实大家可以看到基本上大同小异的. MEF的延迟加载 我们知道当装配一个组件的时候,当前组件里面的所有的Import的 ...
- MEF实现设计上的“松耦合”(一)
1.什么是MEF 先来看msdn上面的解释:MEF(Managed Extensibility Framework)是一个用于创建可扩展的轻型应用程序的库. 应用程序开发人员可利用该库发现并使用扩展, ...
- n-tier waf 41 project 层真够多
ps: http://waf.codeplex.com/releases/view/618696
- 深入理解DIP、IoC、DI以及IoC容器
摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...
随机推荐
- jquery checkbox获取多个选项
http://www.jb51.net/article/27186.htm http://www.cnblogs.com/libingql/archive/2011/11/07/2238663.htm ...
- 企业2.0杀出一号种子选手 “Linkwedo”横空出世
当下,最热门的话题就是企业2.0和1.0的新老交替,在过去的时间里OA在国内几乎是企业1.0的代名词,各大知名OA厂商一直占领着国内的企业市场,但企业2.0在全球越演越烈,甚至大有替代企业1.0的的迹 ...
- Spring的annotation用在set方法上 hibernate的annotation用get方法上
1.Spring的annotation用在set方法上 2.hibernate的annotation用在get方法上
- c#调用c++动态库的一些理解
调用c++动态库一般我们这样写 [DllImport("UCamer.dll", CallingConvention = CallingConvention.Winapi)] ...
- 六月计划#2A(6.10-6.16)
17/35 STL BZOJ_1588_&_Codevs_1296_[HNOI2002]_营业额统计(平衡树/set)(set重做) BZOJ_1208_&_Codevs_1258_[ ...
- 【转】java中静态代码块的用法 static用法详解
原文网址:http://www.cnblogs.com/panjun-Donet/archive/2010/08/10/1796209.html (一)java 静态代码块 静态方法区别一般情况下,如 ...
- 用PowerShell批量部署wsp包
转:http://www.xuebuyuan.com/168337.html 提供wsp部署的参数: $wsppath:wsp文件所在的路径,如"c:\" $wspnames:路径 ...
- [新]最近用unity5弄的一些渲染
Unity Separable Bokeh Depth-of-Field Hexagonal Blur Unity3d Realtime Dynamic Clouds Rendering hemisp ...
- c++11 lambda递归调用写法
偶然想到要在函数内部使用lambda递归调用,以下是可行的写法,可参考 std::function<void(Node * container,const BlendFunc &blen ...
- zookeeper环境的搭建
接管条件:磁盘上原数据完全一样,而自动接管,则是由zookeeper 实现的 FailloverController:控制namenode状态:检查namenode:通过远程协议