前言
在前面的介绍中我们已经知道:导入和导出的匹配需要ContractType,ContractName,Metadata都匹配,这里我们还要介绍一个新东西:创建策略(Creation Policy)。有时候我们在容器中的实例在每一个导入之间共享,即单例;有时候我们需要让每一个导入都拥有一个各自的实例,这在MEF中就是由创建策略决定的。
声明周期(Life Cycle),每一个MEF的部件在容器中都有自己的生命周期,何时创建,何时释放登。本文主要介绍一下MEF中创建策略和生命周期。
创建策略
创建策略,其实就是组合容器决定如何创建部件。在组合容器组合部件时,如果导入和导出匹配成功,则组合容器会将导入成员的值设置成为导出的实例。因此,导出部件的创建策略决定了部件来源于何处:是现有实例还是新实例。
MEF的创建策略有:Shared(共享)和NonShared(非共享)。
使用Shared创建策略的部件将在每一个导入部件中共享实例。仅当容器中没有该部件的实例时才会创建新实例。使用共享策略创建的部件可以是提供服务的部件,以及较占用内存的部件。他们的内部状态应该尽可能少得受外界影响。
使用NonShared创建策略的部件在匹配每一个导入时都会有新的实例。这些部件的内部状态都是相互独立的,当某些部件需要保持特定的状态时可以使用这种策略。
MEF关于创建策略提供的特性有3种:Shared、NonShared、Any(请注意Any和Shared的区别,创建策略只有两种)。导入和导出的默认值都是Any。当导入导出都是用默认创建策略,或者都是默认,MEF将默认创建策略为Shard。创建策略的匹配与否也决定了导出部件和导入能否成功匹配。以下情况可视为匹配成功:
1. 策略标记为Any的导出部件可以与任何导入部件策略(Shared,NonShared,Any,默认)匹配成功。
2. 策略标记为Shared的导出部件可以与标记为Shared、Any和默认(也就是什么都不写只有[Import])的导入部件匹配成功。唯独不能与NonShared导入部件匹配成功。
3. 策略标记为NonShared的导出部件可以与标记为NonShared、Any和默认(也就是什么都不写只有[Import])的导入部件匹配成功。唯独不能与Shared导入部件匹配成功。
DEMO源代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentMode