`
insertyou
  • 浏览: 891281 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

MEF程序设计指南八:部件生命周期(Parts Lifetime)托管

阅读更多

  MEF中的每一个可进行动态装配的导出部件都是具有生命周期的,在没有特别需求的情况下一般都没有对生命周期进行管理,而实际上MEF已为每一个部件进行了默认的生命周期管理,MEF的生命周期分为三种:Any、Shared及NonShared,被定义在System.ComponentModel.Composition.CreationPolicy枚举对象中。

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->namespaceSystem.ComponentModel.Composition
{
publicenumCreationPolicy
{
Any
=0,
Shared
=1,
NonShared
=2,
}
}

  Any表示可共享或不共享,部件的实例用MEF容器根据不同的请求需求自动控制;Shared表示共享部件,既Shared类型的插件部件可以在多个MEF组合容器中共用;其次是NonShared类型,表示不共享部件实例,每当有新的请求就会创建一个新的对象实例。在MEF中,通过PartCreationPolicyAttribute特性实现对部件的生命周期配置。

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->publicinterfaceIBookService
{
stringGetBookName();
}

[PartCreationPolicy(CreationPolicy.Any)]
[Export(
typeof(IBookService))]
publicclassMEFBookService:IBookService
{
publicstringGetBookName()
{
return"《MEF程序设计指南》";
}
}

[PartCreationPolicy(CreationPolicy.NonShared)]
[Export(
typeof(IBookService))]
publicclassASPNETBookService:IBookService
{
publicstringGetBookName()
{
return"《ASP.NET项目案例》";
}
}

[PartCreationPolicy(CreationPolicy.Shared)]
[Export(
typeof(IBookService))]
publicclassSLBookService:IBookService
{
publicstringGetBookName()
{
return"《Silverlight高级编程》";
}
}

  如上示例代码分别演示了使用Any、Shared及NonShared类型的生命周期托管类型对不同的对象进行导出部件配置。接下来通过导入部件并加入生命周期托管筛选,详细应用如下代码块所示:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->publicpartialclassMainPage:UserControl
{
[ImportMany(RequiredCreationPolicy
=CreationPolicy.Shared)]
publicList<IBookService>Service{get;set;}

publicMainPage()
{
InitializeComponent();

CompositionInitializer.SatisfyImports(
this);
//得到成功装配的部件总数为2,因为Any类型是可以共存于多个MEF容器的。
intcount=Service.Count;
}
}

  表面上看去和上一篇指南中介绍的部件的筛选过滤功能非常相似,不同是的过滤筛选是通过自定义筛选策略实现,而这里是通过MEF生命周期范围托管来实现的。在实际的项目开发中需根据不同的应用场景确定具体的技术实现方案。

  除了容器部件的生命周期托管,我们也得考虑部件容器自身的生命周期,容器什么时候释放资源,时候时候释放其内部部件的资源占用等。为了提高系统的整体性能,MEF建议将每一个可导入部件实现IDisposable 接口,用于资源的占用处理,如果部件从MEF容器中移除那么所对应占用的资源也会自动的清理。这里需要注意一点,就是当组合容器被释放掉后迟延加载的操作就不能再继续工作了,会抛出System.ObjectDisposedException异常。

      

  如上图所示,MEF的容器是具有层次结构的,最高层级容器为程序直接应用级容器,可以通过以下的代码获取到。

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->varcatalog=newAssemblyCatalog(typeof(MainPage).Assembly);
varcontainer
=newCompositionContainer(catalog);

  位于顶级容器之下的子容器,通常来说都是控制着一些可动态装配的部件对象,如同上一篇指南中介绍到使用过滤器筛选部件的应用案例,通过过滤表达式从顶级容器中进行筛选,得出了新的MEF容器child,child托管着根据条件过滤筛选出来的所有结果部件对象。详细代码如下:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->//获取当前应用程序目录
varcatalog=newAssemblyCatalog(typeof(MainPage).Assembly);
//将目录装载进MEF组合容器
varparent=newCompositionContainer(catalog);
//通过元数据过滤筛选出元数据名称为"UC"值为"CC"的组合部件
varfilteredCat=newFilteredCatalog(catalog,
def
=>def.Metadata.ContainsKey("UC")&&
def.Metadata[
"UC"].ToString()=="CC");
varchild
=newCompositionContainer(filteredCat,parent);
varcontrol
=child.GetExportedValue<UserControl>();

MEF官方网站:http://mef.codeplex.com/

  推荐指南:MEF程序设计指南一:在应用程序中宿主MEF

       MEF程序设计指南二:Silverlight中使用CompositionInitializer宿主MEF

       MEF程序设计指南三:MEF中组合部件(Composable Parts)与契约(Contracts)的基本应用

       MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)

     MEF程序设计指南五:迟延(Lazy)加载导出部件(Export Part)与元数据(Metadata)

       MEF程序设计指南六:MEF中的目录服务(DeploymentCatalog)

MEF程序设计指南七:使用目录(Catalog)动态装载xap与目录筛选(Filtered Catalog)

分享到:
评论

相关推荐

    MEF组件式开发,模块化开发

    MEF(Managed Extensibility Framework)是微软提供的一种组件化开发框架,主要用于构建可扩展的应用程序。MEF允许开发者将应用程序划分为独立的、可替换的组件,这些组件可以动态地发现并集成到系统中,从而实现了...

    Mef_MEFwinForm_

    5. **Lifetime Management(生命周期管理)**:了解如何控制插件的生命周期,比如何时创建实例,何时释放资源。 6. **依赖注入**:MEF也提供依赖注入功能,学习如何利用这一特性来解耦代码,提高可测试性和可维护性...

    扩展性MEF.rar111

    4. **容器(Container)**: MEF的核心是容器,它负责管理部件的生命周期,匹配导入和导出,以及实例化和组合部件。 5. **元数据(Metadata)**: 允许部件提供附加信息,以便在选择合适的部件时进行筛选。 **MEF的...

    MEF简单应用

    5. **容器(Container)**:容器是MEF的核心,它负责管理部件的生命周期,包括创建、解析和销毁部件。通过容器,部件之间的依赖关系得以解决。 **在控制台应用中实现MEF** 1. **创建部件**:首先,我们需要创建...

    MEFCatalogs.rar

    综上所述,"MEFCatalogs.rar"的"006 MEF Catalogs"文件可能会涵盖这些主题,详细解释如何使用MEF来创建可扩展的应用程序,以及如何设计和管理Catalogs来实现部件之间的协作。学习和理解MEF Catalogs对于构建模块化、...

    MEF框架源代码 MEF框架源代码 MEF框架源代码

    4. **容器(Container)**:MEF的容器负责管理组件的生命周期,发现和解析依赖关系,以及创建和激活组件实例。它是整个框架的核心,通过 `CompositionContainer` 类实现。 5. **元数据(Metadata)**:除了类型本身...

    MEF简单模型

    1. **部件(Parts)**:在MEF中,部件是指实现特定接口或具有特定属性的类。它们可以是任何.NET类型,如类、接口或委托。部件是MEF的基础构建块,可以作为服务提供者或消费者。 2. **导入(Imports)**:部件可能有...

    vs-mef, Visual Studio 使用的托管扩展性框架( MEF ) 实现.zip

    vs-mef, Visual Studio 使用的托管扩展性框架( MEF ) 实现 ( 管理扩展性框架工作室的视觉风格) 特性一个新的,更快的主机,为你现有的MEF部件重用已经使用的MEF属性ExportFactory&lt;T&gt; 支持创建具有作用域生命周期的子...

    WPF下使用MEF导入带参数构造函数的用户控件

    在Windows Presentation Foundation (WPF) 应用程序开发中,我们常常会遇到需要动态加载、组合组件的情况。Managed Extensibility ...在实际项目中,你可能还需要处理更多细节,比如错误处理、生命周期管理等。

    MEF框架整理学习内容

    **Managed Extensibility Framework (MEF)**,即托管可扩展性框架,是Microsoft在.NET平台下推出的一个用于解决应用程序扩展性的框架。在MEF发布之前,业界已经有多种依赖注入框架来解决软件系统的扩展性问题,例如...

    MEF 结合 MVVMLight

    MEF是一个用于构建可扩展应用程序的.NET框架,而MVVMLight则是一个轻量级的MVVM(Model-View-ViewModel)设计模式实现库,它简化了UI和业务逻辑之间的解耦。** **MEF的主要功能包括:** 1. **组件发现**:MEF允许...

    Managed Extensibility Framework(MEF)

    1. **部件(Parts)**:MEF中的基本构建块,可以是任何.NET类型的实例,如类、接口或其他自定义类型。这些部件可以包含导出(Exports)和导入(Imports)。 2. **导出(Exports)**:部件提供给其他部件使用的功能...

    mef与wcf整合

    - MEF提供了一种统一的方式来处理服务实例的生命周期和异常情况,例如,可以设置服务的生命周期策略,以及全局的异常处理机制。 9. **安全性**: - 尽管MEF本身不直接处理安全性,但结合WCF,我们可以利用WCF提供...

    Silverlight MEF 演示源代码

    7. **生活周期管理**:MEF提供了对对象生活周期的控制,例如单例模式的支持。在Silverlight MEF项目中,你可能会看到如何配置和使用这些功能。 8. **错误处理**:在实际开发中,MEF的错误处理机制也很重要。源代码...

    MEF学习Demo

    5. **容器(Container)**:容器是MEF的核心,负责部件的创建、依赖解析和生命周期管理。部件之间通过容器进行连接和通信。 **MEF的使用步骤** 1. **定义部件**:编写要导出的类,使用`[Export]`特性标记要导出的...

    C# MEF使用实例

    MEF提供了几种不同的生命周期管理策略,包括`Singleton`、`PerDependency`等,用于控制组件实例的创建和生存期。 ### 7. 错误处理 MEF在加载组件时会捕获并处理错误,如导入未找到或类型不匹配等,允许应用程序在...

    Mef实现的简单例子

    这个框架允许开发者轻松地引入外部组件,并在运行时发现和组合这些组件,以实现高度灵活和模块化的应用程序设计。MEF适用于那些需要频繁添加、修改或替换功能的大型系统,因为它提供了一种无需更改核心代码就能扩展...

    MEF Console Example

    1. **Composable Parts(可组合部件)**:这些是定义了服务或功能的类,它们通过导入(Import)和导出(Export)特性标记,表明它们对其他组件的依赖以及自身可以提供的服务。 2. **Catalogs(目录)**:MEF使用...

Global site tag (gtag.js) - Google Analytics