平台,扩展框架,应用市场==组成整个应用生态链.
组件:动态发现、重用和组合的应用程序、测试。
ioc:IoC 亦称为 “依赖倒置原理”("Dependency Inversion Principle")。差不多所有框架都使用了“倒置注入(Fowler 2004)技巧
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题
http://msdn.microsoft.com/zh-cn/magazine/ee291628.aspx
IoC最大的缺点是什么?(1)生成一个对象的步骤变复杂了(事实上操作上还是挺简单的),对于不习惯这种方式的人,会觉得有些别扭和不直观。(2)对象生成因为是使用反射编程,在效率上有些损耗。但相对于IoC提高的维护性和灵活性来说,这点损耗是微不足道的,除非某对象的生成对效率要求特别高。(3)缺少IDE重构操作的支持,如果在Eclipse要对类改名,那么你还需要去XML文件里手工去改了,这似乎是所有XML方式的缺憾所在。
IoC最大的好处是什么?因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拔(有点象USB接口和SCSI硬盘了)。
集中了对象的创建,
ioc:我定义接口,你一实现,凹形接口,可替换,相对于clinet端应有比较大的价值
http://www.cnblogs.com/xuf22/archive/2012/02/14/2350754.html
http://msdn.microsoft.com/zh-cn/library/dd460648.aspx
什么是 MEF?
Managed Extensibility Framework 即 MEF 是用于创建轻量、可扩展应用程序的库。 它让应用程序开发人员得以发现和使用扩展且无需配置。 它还让扩展开发人员得以轻松地封装代码并避免脆弱的紧密依赖性。 MEF 让扩展不仅可在应用程序内重复使用,还可以跨程序重复使用。
想象你是必须为扩展性提供支持的大型应用程序的设计者。 你的应用程序必须包含可能很多的较小组件,且其负责创建和运行较小组件。
解决问题最简单的方法就是将组件作为源代码包括在你的应用程序并直接从代码中调用它们。 这有很多明显缺点。 最重要的是,你无法在未调试源代码的情况下添加新组件,这是一项可能被接受的限制(例如在 Web 应用程序中),但不适用于客户端应用程序。 同样造成问题的是,你无法访问组件的源代码,因为组件可能由第三方进行了发展,同时由于同样的原因你不能允许第三方访问你的源代码。
一个稍许复杂的方法为提供扩展点或接口来允许应用程序和组件间的分离。 在此模块下,你可能提供组件可实现的接口以及使接口能与应用程序交互使用的 API。 这解决了要求源代码访问的问题,但它仍然存在自身问题。
因为应用程序缺少自行发现组件的能力,所以必须明确对其指出可用且应加载的组件。 这通常通过在配置文件中明确记录可用组件来完成。 这意味着确保组件正确变成了维护问题,尤其当要求执行更新的人员是最终用户而非开发人员时。
此外,组件能够与另外的组件进行沟通,除了通过应用程序自身的严格定义的通道。 通常不会出现应用程序设计者未预测到特定通信的需求的情况。
最终,组件开发人员必须接受包含他们实现的接口的程序集所在的硬依赖项。 这使得在一个以上的应用程序中使用组件变得困难,且它还会在你创建组件的测试框架时造成问题。
MEF 通过 组合 提供了一种隐式发现它们的方法,而不是明确记录可用组件。 MEF 组件(称为一个 部分),以声明方式详细说明了其依赖项(称为 导入)及其可提供的功能(称为导出)。 当创建一个部分时,MEF 组合引擎利用从其他部分获得的功能满足其导入需要。
该方法解决了在之前部分中讨论的问题。 因为 MEF 部分以声明方式详细说明了其可在运行时发现自身的功能,这意味着应用程序不使用硬编码引用或脆弱的配置文件也能够使用 MEF 部分。 MEF 让应用程序得以通过元数据发现和检查部分,而无须将部分实例化甚至于加载其程序集。 因此,无须仔细说明应当何时加载扩展以及如何加载。
除了它提供的导出之外,部件能够指出其导入(将由其他部件填写)。 这不仅使部件之间的通信成为可能还使其变得简单,并且实现了良好的代码分解。 例如,对于许多组件都很普通的服务可被分解为单独部分,可轻易地进行调试和替换。
因为 MEF 模块在特定的应用程序集上没有硬依赖项,所以它允许扩展在不同应用程序之间重复使用。 这使得开发用于测试扩展组件的测试工具(独立于应用程序)变得简单。
通过使用 MEF 编写的可扩展应用程序声明了一个可由扩展组件填写的输入,它还可能为了向扩展揭示应用程序服务而声明导出。 每个扩展组件都声明一个导出,还有可能声明导入。 通过此方法,扩展组件自身为自动可扩展。