MEF 编程指南(九):部件生命周期
理解 MEF 容器部件生命周期和实现是非常重要的事情。考虑到 MEF 关注可扩展应用程序。这变得尤为重要。生命期可以解释为期望部件的共享性(transitively, its exports)
- Shared:部件所有者告知 MEF 一个或多个部件的实例存在于容器。
- NonShared: 部件所有者告知 MEF 每次对于部件导出的请求将会被一个新的实例处理。
- Any 或者不支持的值: 部件所有者允许部件用作“Share”或者“NonShared”。
- [PartCreationPolicy(CreationPolicy.NonShared)]
- [Export(typeof(IMessageSender))]
- public class SmtpSender : IMessageSender
- {
- public void Send(string message)
- {
- throw new NotImplementedException();
- }
- }
- public interface IMessageSender
- {
- void Send(string message);
- }
- [Export]
- public class Importer
- {
- [Import(RequiredCreationPolicy = CreationPolicy.NonShared)]
- public Dependency Dep { get; set; }
- }
- | Part.Any | Part.Shared | Part.NonShared |
---|---|---|---|
Import.Any | Shared | Shared | Non Shared |
Import.Shared | Shared | Shared | No Match |
Import.NonShared | Non Shared | No Match | Non Shared |
- 实现 IDisposable 的部件会调用 Dispose 方法
- 容器中包含的部件引用将会被清除
- 共享部件会被释放和清除
- 容器释放后,延迟导出不会起作用
- 该操作可能会抛出 System.ObjectDisposedException 异常
- 部件被标记为 Shared
- 部件实现了 IDisposable 接口
- 一个或多个导入配置为允许重组
- var batchProcessorExport = container.GetExport<IBatchProcessor>();
- var batchProcessor = batchProcessorExport.Value;
- batchProcessor.Process();
- container.ReleaseExport(batchProcessorExport);


- [Export]
- public class SomeService : IDisposable
- {
- [Import]
- public ILogger Logger { get; set; }
- public void Dispose()
- {
- Logger.Info("Disposing"); // might throw exception!
- }
- }
- using System;
- using System.ComponentModel.Composition;
- using System.ComponentModel.Composition.Hosting;
- using System.ComponentModel.Composition.Primitives;
- class Program
- {
- static void Main(string[] args)
- {
- var catalog = new AssemblyCatalog(typeof(Program).Assembly);
- var container = new CompositionContainer(catalog);
- var root = new Root();
- // add external part
- container.ComposeParts(root);
- // ... use the composed root instance
- // removes external part
- batch = new CompositionBatch();
- batch.RemovePart(root);
- container.Compose(batch);
- }
- }
- public class Root
- {
- [Import(RequiredCreationPolicy = CreationPolicy.NonShared)]
- public NonSharedDependency Dep { get; set; }
- }
- [Export, PartCreationPolicy(CreationPolicy.NonShared)]
- public class NonSharedDependency : IDisposable
- {
- public NonSharedDependency()
- {
- }
- public void Dispose()
- {
- Console.WriteLine("Disposed");
- }
- }
MEF 编程指南(九):部件生命周期的更多相关文章
- MEF初体验之九:部件生命周期
理解MEF容器中部件的生命周期及其含义是非常重要的.鉴于MEF重点在开放端应用程序,这将变得尤其重要的,一旦app ships和第三方扩展开始运行,作为应用程序的开发者将很好地控制这一系列的部件.生命 ...
- MEF 编程指南(二):定义可组合部件和契约
可组合部件(Composable Parts) 在 MEF 内部可组合部件是一个可组合单元.可组合部件导出其他可组合部件需要的服务,并且从其他可组合部件导入服务.在 MEF 编程模型中,可组合部件 ...
- Java并发编程:线程的生命周期是个怎样的过程?
前言 在日常开发过程中,如果我们需要执行一些比较耗时的程序的话,一般来说都是开启一个新线程,把耗时的代码放在线程里,然后开启线程执行.但线程是会耗费系统资源的,如果有多个线程同时运行,互相之间抢占系统 ...
- Angular4学习笔记(九)- 生命周期钩子简介
简介 Angular 指令的生命周期,它是用来记录指令从创建.应用及销毁的过程.Angular 提供了一系列与指令生命周期相关的钩子,便于我们监控指令生命周期的变化,并执行相关的操作.Angular ...
- Spring5参考指南:Bean的生命周期管理
文章目录 Spring Bean 的生命周期回调 总结生命周期机制 startup和Shutdown回调 优雅的关闭Spring IoC容器 Spring Bean 的生命周期回调 Spring中的B ...
- MEF 编程指南(十二):批量组合
MEF 容器实例并非不可变的.如果目录支持改变(像监控目录变动)或者在运行时添加/移除部件都可能发生改变.以前,你不得不做出改动并且调用 CompositionContainer 上的 Compose ...
- MEF 编程指南(十一):查询 CompositionContainer
CompositionContainer 公开了一部分获取导出.导出对象以及两者集合的重载. 在这些方法重载中,你应该遵循下面的共享行为准则 - 除非特别说明. 当请求单一实例的时候,如果没发 ...
- MEF 编程指南(七):使用目录
目录(Catalogs) MEF 特性编程模型的核心价值,拥有通过目录动态地发现部件的能力.目录允许应用程序轻松地使用那些通过 Export Attribute 注册自身的导出.下面列出 MEF ...
- MEF 编程指南(十):重组
有些应用程序被设计成在运行时动态地改变.例如,一个新的扩展可能被下载,或者其他原因变得不可用.MEF 依靠我们称之为重组(Composition)的技术处理,在初始化组合以后改变导入值的场景. 导 ...
随机推荐
- bq24075 锂电池 充电电路分析
bq24075 锂电池 充电电路分析 本文主要是分析bq24075锂电池充电芯片电路,知道其大致是怎么工作的,其中的一些电阻该如何配置. -- 深圳 南山平山村 曾剑锋 一.参考文章: . NTC热 ...
- git - 搭建git仓库
1. 更新git版本: http://codelife.me/blog/2013/06/25/upgrade-git-on-centos-6-4/ 2. 建立git仓库: git init --bar ...
- Java [Leetcode 223]Rectangle Area
题目描述: Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is def ...
- Java 单元测试(Junit)
在有些时候,我们需要对我们自己编写的代码进行单元测试(好处是,减少后期维护的精力和费用),这是一些最基本的模块测试.当然,在进行单元测试的同时也必然得清楚我们测试的代码的内部逻辑实现,这样在测试的时候 ...
- mysql 自旋锁
自旋(spin)是一种通过不间断地测试来查看一个资源是否变为可用状态的等待操作,用于仅需要等待很短的时间等待所需资源的场景.使用自旋这种“空闲循环(busy-loop)”来完成资源等待的方式要比通过上 ...
- ASP.NET MVC+Bootstrap个人博客之后台dataTable数据列表(五)
jQuery dataTables 插件是一个优秀的表格插件,是后台工程师的福音!它提供了针对数据表格的排序.浏览器分页.服务器分页.查询.格式化等功能.dataTables 官网也提供了大量的演示 ...
- 无人机DLG生产作业流程
参考文章 无人机(AVIAN)低空摄影测量作业流程 无人机低空遥感测绘作业流程及主要质量控制点 微型无人机低空摄影测量系 无人机航空摄影测量系统引进与发展 基于复杂地形的无人机航摄系统1∶500 DL ...
- UI篇--Android中TableLayout中的布局
表格布局是按照行列来组织子视图的布局.表格布局包含一系列的Tablerow对象,用于定义行(也可以使用其它子对象).表格布局不为它的行.列和单元格显示表格线.每个行可以包含个以上(包括)的单元 ...
- DevExpress 中根据数据库字典动态生成卡式菜单 z
第三方的Devexpress套件因为要使用权限机制控制不同用户进入系统显示菜单所以要配合字典数据动态生成.在WEB中这种问题灰常的轻松在winform里就稍微有点不同为了用DEV实现卡式菜单有组的概念 ...
- 1、ListView自定义控件下拉刷新(一)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layo ...