本系列文章非原创,转载自:
作 者:Beniao
文章出处:http://beniao.cnblogs.com/
或 http://www.cnblogs.com/
MEF可以在传统应用程序中使用(包括桌面的Winform、控制台程序和Web的ASP.NET),也可以在RIA的Silverlight中使用。在Silverlight中只是宿主的方式有所不同,实际上在Silverlight中也可以像传统应用程序中是方式去宿主
,MEF也为Silverlight提供了独特的宿主方式,使用中需要引用System.ComponentModel.Composition.Initialization.dll动态链接库。
Silverlight中提供了一种新的宿主MEF的方式,只需要在Application_Startup事件处理函数中通过调用
System.ComponentModel.CompositionInitialization程序集的
System.ComponentModel.Composition.CompositionInitializer类里面的方法一行代码就可以完成
MEF的宿主,这是非常方便、简单的。详细如下代码块:
<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
private void Application_Startup(object sender, StartupEventArgs e)
{
CompositionInitializer.SatisfyImports(this);
}
下面用一个简单的示例程序演示下在Silverlight中的MEF的基本应用。比如编写一个日志组件,分别提供两种写日志的方式,既写文本日志和数据库日志,那么对于需要通过MEF托管的部件可以如下代码定义:
<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
public interface ILogger
{
void WriteLog(string message);
}
[Export("TXT",typeof(ILogger))]
public class TXTLogger : ILogger
{
public void WriteLog(string message)
{
System.Console.WriteLine(message);
}
}
[Export("DB",typeof(ILogger))]
public class DBLogger : ILogger
{
public void WriteLog(string message)
{
System.Console.WriteLine(message);
}
}
分别将两个不同的日志记录组件都通过[ExportAttribute]进行标注为导出部件,并分别为其设置好通信契约,那么在导入他们的地方
就直接通过契约确定分别导入什么类型的日志记录实现部件。可以通过提供一个统一的门面服务以供系统中统一调用,大致如下代码所示:
<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
/// <summary>
/// 门面服务,聚合不同的日志记录部件,通过MEF进行组合
/// </summary>
[Export]
public class FacadeService
{
[Import("TXT")]
public ILogger TXTLogger { get; set; }
[Import("DB")]
public ILogger DBLogger { get; set; }
}
实际上门面服务作为一个简单、单纯的辅助类,也是可以通过MEF进行动态装配的,如上代码就将FacadeService也进行了
[ExportAttribute]标注,表示此门面类也是一个可装配的部件,那么在App 中同样可以通过[ImportAttribute]进行导入
的。
<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
/// <summary>
/// 导入FacadeService
/// </summary>
[Import]
public FacadeService Service { get; set; }
接下来看看如何调用,FacadeService是被导入在App中的,在应用的时候可以通过Application.Current获取到当前Silverlight的App对象,总而达到可调用被导入在App中的部件。
public MainPage()
{
InitializeComponent();
var service = (Application.Current as App).Service;
service.TXTLogger.WriteLog("写日志到文本文件");
service.DBLogger.WriteLog("写日志到数据库");
}
分享到:
相关推荐
3. **MEF在Silverlight中的应用** 在"Silverlight Mef Demo"中,MEF被用来管理运算器的不同扩展。运算器不仅可以静态地导入预定义的运算功能,还可以动态地从网络下载新的运算包,这种灵活性是通过MEF的组件导入和...
MEF(Managed Extensibility Framework)是微软提供的一种用于构建可扩展应用程序的框架,它在Silverlight中扮演着重要角色,尤其是在大型复杂项目中,帮助开发者实现模块化和插件化。 在"Silverlight MEF 演示源...
在Silverlight中,MEF的使用可以帮助开发者创建更模块化的应用程序,每个模块可以独立开发和更新,从而降低了维护成本。例如,一个银光应用可能包含多个用户界面模块,每个模块都可以作为一个独立的MEF组件存在,...
Mef silverlight Example Dianamic Compose Mef silverlight Example Dianamic Compose Mef silverlight Example Dianamic Compose
**MEF(Managed Extensibility Framework)与MVVMLight结合使用是现代Windows应用程序开发中的一个常见实践,尤其在WPF和Silverlight项目中。MEF是一个用于构建可扩展应用程序的.NET框架,而MVVMLight则是一个轻量级...
4. **主程序配置**:在主程序中,引入MEF库,设置插件目录,并使用 `CompositionContainer` 来加载插件。主程序通过查询容器来获取并实例化插件中的控件。 5. **动态加载**:在运行时,根据需要加载或卸载插件,以...
5. 使用组件:通过容器获取或创建组件实例,并在应用程序中使用。 在深入学习MEF框架源代码时,可以关注以下方面: - 如何定义和使用导出和导入。 - 容器如何解析依赖关系和创建对象。 - 元数据在组件选择中的作用...
在本文中,我们将深入探讨如何使用WPF(Windows Presentation Foundation)结合Caliburn.Micro和MEF(Managed Extensibility Framework)构建一个可插拔的框架。这些技术可以帮助开发者创建灵活、可扩展的应用程序,...
在 Silverlight 应用中,MEF 可用于动态加载和管理插件,使应用程序能够适应未来的变化和扩展。 **Model-View-ViewModel (MVVM)** MVVM 是一种软件设计模式,特别适用于 XAML 基础的 UI 框架,如 Silverlight。在...
本篇文章将详细探讨如何在WPF环境中,使用MEF来导入具有参数构造函数的用户控件。 首先,理解MEF的基本概念是至关重要的。MEF是一种轻量级的插件框架,允许开发者创建松散耦合的应用程序。它通过提供一种方式来发现...
**WPF Prism MEF 架构详解** WPF(Windows Presentation ...通过研究这个示例项目,开发者可以深入了解如何在WPF应用中有效地利用Prism和MEF实现模块化、依赖注入和插件化,从而构建出灵活、可扩展的应用程序。
Managed Extensibility Framework (MEF) 是 .NET Framework 4.0 中引入的一个组件,它提供了一种简单而灵活的方式来实现应用程序的扩展性和插件架构。MEF 可以帮助开发者轻松地发现、组合和重用应用程序组件,而无需...
- **MEF(Managed Extensibility Framework)**:是.NET Framework中的一个新库,旨在提高应用程序和组件的重用能力。通过使用MEF,.NET应用能够从静态编译转变为动态组合。 - **软件开发与维护的挑战**: - 原始...
3. **使用MEF导入和导出**:在ViewModel中,使用MEF的`[Import]`特性标记需要的依赖项,而插件的实现类则使用`[Export]`特性标记自身,表明它是插件的实现。 4. **注册和激活插件**:在应用程序启动时,MEF会自动...
同样,文档的使用也不代表任何MEF成员公司会宣布与文档中包含的想法、技术、概念或表达有关的任何产品或服务,或者如果这样的声明被作出,这样的产品或服务将包含全部或部分文档中包含的想法、技术或概念。...
MEF允许开发者将应用程序划分为独立的、可替换的组件,这些组件可以动态地发现并集成到系统中,从而实现了模块化的开发模式。 ### 1. MEF基础概念 - **部件(Part)**:在MEF中,一个部件代表了一个可插拔的组件,...
在Silverlight中,你可以利用C#或VB.NET进行后端逻辑开发,同时使用XAML进行前端设计,实现前后端的分离,提高了开发效率。 MEF,全称为Managed Extensibility Framework,是一个设计用于.NET应用程序的框架,旨在...
- 宿主程序中定义了一个`IBookService`类型的属性,并通过`[Import]`属性标记,表明这个属性需要由MEF自动填充。 - 通过调用`ComposeParts`方法将宿主程序和部件实例加入组合容器中,实现了部件的自动装配。 #### ...
本资源是一个简单的 C# MEF(Managed Extensibility Framework)示例代码,适合初学者学习 MEF 的基本概念和使用方法。 什么是 MEF MEF 是一个由 Microsoft 开发的框架,用于实现应用程序的可扩展性和模块化。它...