在应用程序中宿主MEF其实非常简单,只需要创建一个组合容器对象(CompositionContainer)的实例,然后将需要组合的部件(Parts)和当前宿主程序添加到容器中即可。首先需要添加MEF框架的引用,既System.ComponentModel.Composition.dll,详细如下代码块:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->privatevoidCompose()
{
varcatalog=newAssemblyCatalog(Assembly.GetExecutingAssembly());
varcontainer=newCompositionContainer(catalog);
container.ComposeParts(this);
}
通过上面的代码实现就可以完成MEF的宿主,实际上在使用MEF的开发过程中并不会如此简单的应用。可能会定义一个或多个导入(Import)和导出(Export)部件,然后通过MEF容器进行组合,其实也可以理解为“依赖注入”的一种实现。比如定义一个图书接口和一个接口的实现类,在此基础上使用MEF的导入导出特性:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->publicinterfaceIBookService
{
voidGetBookName();
}
///<summary>
///导入
///</summary>
[Export(typeof(IBookService))]
publicclassComputerBookService:IBookService
{
publicvoidGetBookName()
{
Console.WriteLine("《HelloSilverlight》");
}
}
如上代码通过使用MEF的[System.ComponentModel.Composition.Export]对接口的实现进行导出设置,让接口的实现以容器部件的方式存在,然后通过组合容器进行装配加载,这个过程中就包括了接口的实例化的过程。接下来就需要在MEF的宿主程序中定义一个接口的属性,并为其标注[System.ComponentModel.Composition.Import]特性以实现接口实现类的导入。如下代码块:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->///<summary>
///导入接口的实现部件(Part)
///</summary>
[Import]
publicIBookServiceService{get;set;}
完成了导入导出的接口与实现的开发及特性配置,下面就剩下一步组合了,也就是本文提到的将部件和宿主程序自身添加到组合容器中,以实现导入(Import)和导出(Export)的组合装配。
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->///<summary>
///宿主MEF并组合部件
///</summary>
privatevoidCompose()
{
varcatalog=newAssemblyCatalog(Assembly.GetExecutingAssembly());
varcontainer=newCompositionContainer(catalog);
//将部件(part)和宿主程序添加到组合容器
container.ComposeParts(this,newComputerBookService());
}
通过以上步骤就完成了MEF的宿主以及一个简单的部件组合的应用示例,下面是本文的完整代码示例:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.ComponentModel.Composition;
usingSystem.ComponentModel.Composition.Hosting;
usingSystem.Reflection;
namespaceHostingMef
{
publicinterfaceIBookService
{
voidGetBookName();
}
///<summary>
///导入
///</summary>
[Export(typeof(IBookService))]
publicclassComputerBookService:IBookService
{
publicvoidGetBookName()
{
Console.WriteLine("《HelloSilverlight》");
}
}
classProgram
{
///<summary>
///导入接口的实现部件(Part)
///</summary>
[Import]
publicIBookServiceService{get;set;}
///<summary>
///宿主MEF并组合部件
///</summary>
privatevoidCompose()
{
varcatalog=newAssemblyCatalog(Assembly.GetExecutingAssembly());
varcontainer=newCompositionContainer(catalog);
//将部件(part)和宿主程序添加到组合容器
container.ComposeParts(this,newComputerBookService());
}
staticvoidMain(string[]args)
{
Programp=newProgram();
p.Compose();
p.Service.GetBookName();
}
}
}
注:本文参考Hosting MEF in an application,详细请大家阅读原文。
MEF官方网站:http://mef.codeplex.com/
分享到:
相关推荐
在Windows Presentation Foundation(WPF)开发中,Microsoft Managed Extensibility Framework(MEF)是一种强大的工具,用于实现应用程序的模块化和插件化。MEF提供了一种灵活的方式,使得组件之间可以互相发现和...
在本篇中,我们将探讨MEF的基本概念、如何导入和导出部件,以及如何在控制台应用程序中实现一个简单的MEF应用。 **MEF的核心概念** 1. **部件(Parts)**:在MEF中,任何可以被导入和导出的对象都被称为部件。部件...
**MEF(Managed Extensibility Framework)与MVVMLight结合使用是现代Windows应用程序开发中的一个常见实践,尤其在WPF和Silverlight项目中。MEF是一个用于构建可扩展应用程序的.NET框架,而MVVMLight则是一个轻量级...
6. **部分类(Part)**:在MEF中,组件通常被称为“部分”,因为它们可以是整个应用程序的一部分,每个部分都可能独立地被替换或扩展。 7. **目录(Catalog)**:目录是包含组件定义的集合,它可以是基于文件系统、...
例如,以下代码展示了如何在Silverlight应用中使用MEF: ```csharp [Export(typeof(IUserInterface))] public partial class MainPage : UserControl, IUserInterface { [Import] public IBackendService ...
在WPF中结合MEF,我们可以创建一个允许外部插件(通常是DLL形式)来扩展应用程序核心功能的系统。 标题"使用MEF方式实现插件化加载控件"指的是,将特定的WPF控件开发为单独的类库项目,编译成DLL文件。这些DLL文件...
- **MEF(Managed Extensibility Framework)**:是.NET Framework中的一个新库,旨在提高应用程序和组件的重用能力。通过使用MEF,.NET应用能够从静态编译转变为动态组合。 - **软件开发与维护的挑战**: - 原始...
"Silverlight Mef Demo"为初学者提供了一个直观的示例,展示如何在Silverlight应用中集成MEF,以及如何设计和实现可扩展性。通过研究这个示例,开发者可以更好地理解MEF的工作原理,以及如何在实际项目中应用MEF来...
2. 灵活性:MEF 提供了一种灵活的方式来组合不同的组件,以创建一个功能强大且灵活的应用程序。 3. 松耦合:MEF 使得组件之间的耦合度降低,提高了系统的可维护性和可扩展性。 结论 MEF 是一个功能强大且灵活的...
- **组合(Composition)**:MEF将所有部件按照依赖关系组合在一起,形成一个运行时的组件网络。 ### 3. MEF的使用场景 MEF常用于以下场景: - **插件架构**:允许用户添加、删除或替换应用程序的功能模块,无需...
- **插件架构(Plugin Architecture)**:MEF提供了一种机制,允许应用程序在运行时发现和加载外部组件,这些组件可以在不修改主应用程序的情况下添加新功能或扩展已有功能。 - **导出(Export)和导入(Import)**...
3. **配置MEF**:在主应用程序中,配置MEF容器以扫描插件目录并加载实现指定接口的程序集。这可以通过`DirectoryCatalog`实现,它会加载指定目录下的所有dll文件。 4. **使用Caliburn.Micro集成MEF**:通过`...
最后,你需要提供一个实现了`IMyService`接口的类,并在应用程序的某个地方Export它,这样MEF才能在运行时找到并传递给UserControl。例如: ```csharp [Export(typeof(IMyService))] public class ...
**MEF(Managed Extensibility Framework)** 是微软推出的一个扩展性框架,它允许开发者在应用程序中方便地引入和管理插件或者模块。MEF 主要用于构建可扩展的应用程序,使得第三方开发者能够轻松地为应用程序添加...
3. **易于扩展**:MEF提供了一种简洁的方式来进行扩展,而不会影响到核心应用逻辑。 4. **简化配置**:相比传统的依赖注入框架,MEF简化了配置过程,减少了代码量和复杂度。 总之,MEF为.NET平台带来了强大的扩展性...
在 Silverlight 应用中,MEF 可用于动态加载和管理插件,使应用程序能够适应未来的变化和扩展。 **Model-View-ViewModel (MVVM)** MVVM 是一种软件设计模式,特别适用于 XAML 基础的 UI 框架,如 Silverlight。在...
【描述】"c#的插件小例子程序,方便新手学习插件入门"表明这个项目是为初学者设计的,旨在帮助他们理解和掌握MEF在创建可扩展的、模块化的Windows Forms应用中的基本用法。通过这个例子,开发者可以学习到如何将应用...
Managed Extensibility Framework (MEF) 是 .NET Framework 4.0 中引入的一个组件,它提供了一种简单而灵活的方式来实现应用程序的扩展性和插件架构。MEF 可以帮助开发者轻松地发现、组合和重用应用程序组件,而无需...
通过MEF,可以有效地管理和组装应用程序的各个部分,不管是将应用程序设计为能够接受各种插件,还是将功能模块化以便于复用,MEF都能够提供出色的支持。随着.NET技术的不断发展,MEF作为.NET生态系统中的一个重要...
**MVVM模式与Mef插件在WPF中的应用** MVVM(Model-View-ViewModel)模式是软件开发中一种流行的设计模式,特别是在WPF(Windows Presentation Foundation)平台下,它能够有效地分离用户界面(View)和业务逻辑...