- 浏览: 670940 次
- 性别:
- 来自: 石家庄
文章分类
最新评论
-
abao1:
老贾 在安装IDEA的过程中,在激活步骤时,按如下操作即可: ...
IntelliJ IDEA 2016注册方法和注册码 -
bo_hai:
./usr/bin/java: symbol lookup ...
jmagick安装步骤 -
wxcking:
不错的, 收藏一下
JAVA使用POI生成Excel文件 -
zgyfh:
大哥,密码是多少啊?zgyfh@tom.com谢谢了!新手学习 ...
WPF做的必备示例 -
记忆无泪:
jiasongmao 写道你的邮箱是多少,我可以发源代码到邮箱 ...
WPF做的必备示例
本文章非原创,转载自:
作 者:Beniao
文章出处:http://beniao.cnblogs.com/ 或 http://www.cnblogs.com/
MEF中使用导出与导入,实质上就是对一个对象的实例化的过程,通过MEF的特性降低了对象的直接依赖,从而让系统的设计达到一种高灵活、高扩展性 的效果。在具体的设计开发中,存在着某些对象是不需要在系统运行或者的附属对象初始化的时候进行实例化的,仅仅只需要在需要使用到他的时候才会进行实例 化,从系统的上来说这也是提高系统性能的一种可行的实现方式,这种方式就可以理解为对象的迟延初始化,或者叫迟延加载。MEF也对此使用场景提供了完善的 实现机制,下面来看看在MEF中的迟延初始化是如何使用的。
namespace MEFTraining.LzayImports { public interface ILogger { void WriteLog(string message); } [Export(typeof(ILogger))] public class DBLogger : ILogger { public void WriteLog(string message) { MessageBox.Show(message); } } }
通过使用前几篇博文中使用的日志组件为例,在日志记录的具体实现对象上进行对象的导出[Export]配置。如果是使用传统的方式进行部件的导入则如下代码块所示:
[Import(typeof(ILogger))] public ILogger Logger { get; set; }
如果需要进行迟延(Lazy)加载,MEF专门提供了用于迟延加载的方式,既使用Lazy类来完成迟延加载,然后通过其他属性Value获取到所加载到的对象。详细的使用如下代码块:
public partial class MainPage : UserControl { //传统加载 [Import(typeof(ILogger))] public ILogger Logger { get; set; } //迟延加载 [Import] public Lazy<ILogger> Service; public MainPage() { InitializeComponent(); CompositionInitializer.SatisfyImports(this); Logger.WriteLog("日志内容"); Service.Value.WriteLog("日志内容"); } }
通过调试输出可以得到使用迟延导入的对象的详细信息,下面是通过在命令窗口中输出的Service和Service.Value的详细信息。
ThreadSafetyMode = PublicationOnly, IsValueCreated = true , IsValueFaulted = false , Value = {MEFTraining.LzayImports.DBLogger}
IsValueCreated: true
Service.Value
{MEFTraining.LzayImports.DBLogger}
[MEFTraining.LzayImports.DBLogger]: {MEFTraining.LzayImports.DBLogger}
迟延加载还支持元数据的导出和导入,主要使用[MetadataAttribute]特性实现,实际开发中可以进行自定义元数据结构,这里以一个空的元数据接口进行元数据的导入应用演示。
public interface IMetadata { }
在导出部件中就可以使用元数据特性进行声明,如下简单的应用。
[MetadataAttribute] [Export(typeof(Users))] public class Users { public string UserName = "张三"; }
元数据的导入应用如下代码块所示:
public partial class MetadataControl : UserControl { [Import(typeof(Users))] public Lazy<Users,IMetadata> Users { get; set; } public MetadataControl() { InitializeComponent(); //宿主MEF托管扩展容器 CompositionInitializer.SatisfyImports(this); MessageBox.Show(Users.Value.UserName); } }
对于的调试输出为下面代码块所示:
ThreadSafetyMode = PublicationOnly, IsValueCreated = true , IsValueFaulted = false , Value = {MEFTraining.LzayImports.Users}
base {System.Lazy < MEFTraining.LzayImports.Users > }: ThreadSafetyMode = PublicationOnly, IsValueCreated = true , IsValueFaulted = false , Value = {MEFTraining.LzayImports.Users}
Metadata : {_proxy_MEFTraining.LzayImports.IMetadata _0174a468 - 9771 - 4271 - a37e - 9a4a83eca6bd}
MEF中也提供了专门用于元数据导入、导出的特性[ExportMetadata],使用ExportMetadata基本可以满足大部分元数据的导出、导入支持。通过修改上面的示例来实现自定义元数据结构的导入、导出应用演示。
public interface IMetadata { string Name { get; } } [ExportMetadata("Name","李四")] [Export(typeof(Users))] public class Users { public string UserName = "张三"; }
上面的示例代码演示了通过元数据导出属性名为“Name”,其值为“李四”的元数据信息,并且还定义了一个用于承载元数据结构的结构,接下来就可以通过迟延加载导入,进行元数据的获取了。
public partial class MetadataControl : UserControl { [Import(typeof(Users))] public Lazy<Users,IMetadata> Users { get; set; } public MetadataControl() { InitializeComponent(); //宿主MEF托管扩展容器 CompositionInitializer.SatisfyImports(this); MessageBox.Show(Users.Value.UserName); } }
下图为允许调试中的截图,可以很清楚的看到,在进行迟延导入的时候已经将导出部件中的元数据信息成功的导入到了当前对象实例属性中。
下面是完整的元数据应用实例代码。
namespace MEFTraining.LzayImports { public partial class MetadataControl : UserControl { [Import(typeof(Users))] public Lazy<Users,IMetadata> Users { get; set; } public MetadataControl() { InitializeComponent(); //宿主MEF托管扩展容器 CompositionInitializer.SatisfyImports(this); MessageBox.Show(Users.Value.UserName); } } public interface IMetadata { string Name { get; } } [ExportMetadata("Name","李四")] [Export(typeof(Users))] public class Users { public string UserName = "张三"; } }
除此之外,迟延加载也是支持弱类型的元数据类型的,也可以对元数据进行过滤,这里就不做详细的介绍,有兴趣的朋友可以自己去研究研究。
发表评论
-
silvelright酷站
2011-03-22 18:47 808http://completit.com/# -
silverlight翻转代码
2011-03-13 18:46 1115using System; using System.Net ... -
silverlight独立存储示例
2011-03-07 17:17 1060void CreateDir(string dirNam ... -
silverlight SDK和toolit中控件英文如何转换为英文
2010-11-11 15:50 992解决方法: 设置 ... -
Silverlight4:网络地图服务
2010-10-16 11:01 1605Bing Maps与Google Earth一样 ... -
通过JS创建silverlight对象
2010-10-12 13:04 1664前言: 对于我们开发的silverlight应用来讲,有的时 ... -
silverlight childwindow源码
2010-09-18 21:17 1968<!-- // (c) Copyright Micro ... -
精彩的 Silverlight 开源项目
2010-08-18 14:32 2925Silverlight 物理模型 http://www.c ... -
MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)
2010-08-12 10:03 650本文章非原创,转载自: 作 者:Beniao 文 ... -
MEF程序设计指南三:MEF中组合部件(Composable Parts)与契约(Contracts)的基本应用
2010-08-12 09:52 568本文章非原创,转载自: 作 者:Beniao 文 ... -
MEF程序设计指南二:Silverlight中使用CompositionInitializer宿主MEF
2010-08-12 09:24 860本系列文章非原创,转载自: 作 者:Beniao ... -
MEF程序设计指南一:在应用程序中宿主MEF
2010-08-12 09:17 1050本系列文章非原创,转 ... -
silverlight应用程序库缓存
2010-08-10 14:22 1525应用程序库缓存可在用户重新访问网站时帮助改善启动性能。 ... -
Prism动态模块加载
2010-08-10 10:27 1665这篇介绍模块在silverlight的特殊应用. sil ... -
Silverlight中Json数据的转换方法(中文)
2010-08-04 11:36 1243[DataContract] public clas ... -
silverlight万花筒效果
2010-07-28 16:14 893见附件。 -
silverlight如何将颜色字符串转换为颜色
2010-07-02 10:42 1535public class ColorUtil { ... -
silverlight中Tab转Enter的实现方法
2010-06-04 17:38 1734silverlight项目中要求界面全键盘操作,并且在光标移动 ... -
在两个Silverlight应用间数据通信(包括与Flash通信)
2010-05-13 17:06 1008声明:该博文转载自:http://daizhj.blog.51 ... -
silverlight和js相互调用
2010-05-13 16:56 1677步骤一:在silverlight后台代码类中声明被js调用的方 ...
相关推荐
5. **元数据(Metadata)**:除了类型本身,导出还可以携带额外的信息,如版本、描述等,这些信息称为元数据。元数据允许更灵活的组件匹配和选择。 6. **部分类(Part)**:在MEF中,组件通常被称为“部分”,因为...
总结,MEF是C#插件系统的一种强大实现,通过其核心概念和特性,如部件容器、导出和导入、元数据以及延迟加载,开发者可以构建出具有高度可扩展性和模块化的应用程序。通过学习和掌握MEF,你可以提高软件的灵活性和可...
3. **导入元数据**:在插件项目中,使用MEF的 `[Import]` 和 `[Export]` 属性来标记需要导出的类和服务,以及需要导入的依赖项。 4. **主程序配置**:在主程序中,引入MEF库,设置插件目录,并使用 `...
1. **部件(Part)**:在MEF中,部件是具有依赖注入能力的类,它们可以通过导出(Export)和导入(Import)来与其他部件交互。导出表示部件提供了某种服务,而导入则表示部件需要使用其他部件的服务。 2. **导出...
MEF主要包含两个核心概念:Part(部件)和Export(导出),以及Import(导入)。Part代表一个可替换的组件,Export表示Part愿意提供的服务,而Import则声明了一个Part需要依赖的服务。 在WPF中,用户控件(User...
MEF通过引入元数据(Metadata)和导出(Exports)与导入(Imports)的概念,允许代码之间进行松散耦合,从而增强了软件的灵活性和可维护性。 ### 1. MEF的核心概念 #### 导出(Exports) 导出是MEF中的关键概念,...
`DirectoryCatalog` 和 `AssemblyCatalog` 分别用于从指定目录和程序集中加载导出。 5. **延迟组合(Lazy Composition)** - 使用 `Lazy<T>` 或 `ILazyContext` 可以实现延迟加载,只有当真正需要某个导出项时,才...
**MEF组件式开发与模块化开发** MEF(Managed Extensibility Framework)是微软提供的一种组件化开发框架,主要用于构建可扩展的应用程序。MEF允许开发者将应用程序划分为独立的、可替换的组件,这些组件可以动态地...
可以使用`[ExportMetadata]`来添加元数据,方便匹配和筛选导出的组件。 3. **容器(Container)**:MEF的容器负责管理和解析组件之间的依赖关系。它会扫描所有可用的导出,并根据导入的需求进行匹配,然后进行组装...
MEF通过元数据(Metadata)来连接这些导入和导出,从而实现组件的灵活组合。 在这个Demo中,我们可能看到以下关键知识点: 1. **容器(Container)**:MEF的核心是容器,它是负责管理组件的生命周期和依赖关系的...
1. **部件元数据(Part Metadata)**:每个部件都有元数据,用来描述其属性和行为。元数据可以定义部件的导出(Export)和导入(Import)。导出表示部件提供的服务,而导入则表示部件需要依赖的服务。元数据通过...
MEF框架提供了一种强大的方式来构建可扩展的应用程序,通过导入和导出机制,以及元数据和容器的使用,可以轻松管理和组合各种组件。在实际项目中,MEF可以帮助我们构建灵活、模块化的系统,降低代码的耦合度,增强...
5. **元数据(Metadata)**: 允许部件提供附加信息,以便在选择合适的部件时进行筛选。 **MEF的使用场景** 1. **插件架构**: MEF非常适合构建插件式架构,允许用户安装、卸载和更新应用程序的扩展部分。 2. **...
3. **导出元数据(Export Metadata)**:除了导出类型本身,还可以附加一些元数据信息,提供更丰富的上下文信息,帮助导入方选择合适的导出对象。 4. **容器(Container)**:MEF的核心是容器,它负责管理所有导入...
它通过元数据(metadata)和导出(exports)与导入(imports)的概念,实现了组件之间的松耦合。 **WPF(Windows Presentation Foundation)** 是.NET Framework的一部分,用于构建具有丰富图形界面的桌面应用程序...
除了导出类型之外,你还可以通过`[ExportMetadata]`属性提供额外的元数据,这些元数据可以在运行时用于筛选或分类组件。例如,你可能有一个插件需要知道组件的版本号或作者信息,这些都可以作为元数据包含在导出中。...
**MEF简单应用** MEF,全称Managed Extensibility Framework,是.NET Framework的一个组件,由微软开发,用于构建可扩展的...在更复杂的场景下,可能需要使用MEF的高级特性,如导出元数据、部分导入和导出工厂等功能。
- **插件化**:MEF的插件架构与Prism的模块化理念相结合,使得应用程序能够动态加载和卸载功能模块,提供高度可扩展的平台。 **4. 示例项目Prism4MefDemo** Prism4MefDemo是一个使用Prism和MEF实现的示例项目,它...
**MEF(Managed Extensibility Framework)与MVVMLight结合使用是现代Windows应用程序开发中的一个常见实践,尤其在WPF和Silverlight项目中。MEF是一个用于构建可扩展应用程序的.NET框架,而MVVMLight则是一个轻量级...
在`HandT.MEF_Demo.sln`中,我们可能看到一个MEF的演示项目,它包含了多个子项目,如`HandT.MEF_Demo.Web`可能是Web应用程序项目,利用MEF加载和管理插件。`HaneT.MEF_PluginContracts`和`HandT.MEF_Parts_Toolbars`...