标签:响应 typeof min tor 动态 隐式 -shared 重复 跨程序
作用:创建可扩展的轻量级应用程序的库。可以让扩展在程序内重复使用,还可以跨程序重复使用。
导出Export:把部件放到容器中,供其它部件使用。
导入Import:把部件从容器中拿出来使用。
导入和导出必须具有相同的约定:协定类型参数 && 协定名称参数
隐式协定:协定类型参数和协定名称参数将从修饰的属性推断而出。
导出的类型必须与协定类型相同、派生自协定类型,或者实现协定类型接口。
public class MyClass
{
[Import]
public IMyAddin MyAddin { get; set; }
}
协定类型:IMyAddin
协定名称:依据该协定类型创建的唯一字符串。
[Export(typeof(IMyAddin))]
public class MyLogger : IMyAddin { }
协定类型:IMyAddin
协定名称:从协定类型推断而出的。
[Export]
public class MyLogger : IMyAddin { }
协定类型:MyLogger
public class MyClass
{
[Import("MajorRevision")]
public int MajorRevision { get; set; }
}
public class MyExportClass
{
[Export("MajorRevision")] //This one will match.
public int MajorRevision = 4;
[Export("MinorRevision")]
public int MinorRevision = 16;
}
MyClass :
协定类型:MajorRevision
协定名称:MajorRevision
导入和导出方法
public class MyClass
{
[Import] //Contract name must match!
public Func<int, string> DoSomething { get; set; }
}
public class MyAddin
{
//Explicitly specifying a generic type.
[Export(typeof(Func<int, string>))]
public string DoSomething(int TheParam);
}
动态导入:
在某些情况下,导入类可能需要与具有特定协定名称的多个导出匹配。
public class MyClass
{
[Import("TheString")]
public dynamic MyAddin { get; set; }
}
[Export("TheString", typeof(IMyAddin))]
public class MyLogger : IMyAddin { }
[Export("TheString")]
public class MyToolbar { }
延迟导入:Lazy<>
在某些情况下,导入类可能需要间接引入导入的对象,因此不会立即实例化该对象。
public class MyClass
{
[Import]
public Lazy<IMyAddin> MyAddin { get; set; }
}
[Export(typeof(IMyAddin))]
public class MyLogger : IMyAddin { }
必备导入:ImportingConstructor
导出的MEF部件通常由组合引擎创建,以响应填写匹配的导入的直接请求或需求。
public class MyClass
{
private IMyAddin _theAddin;
//Parameterless constructor will NOT be
//used because the ImportingConstructor
//attribute is present.
public MyClass() { }
//This constructor will be used.
//An import with contract type IMyAddin is
//declared automatically.
[ImportingConstructor]
public MyClass(IMyAddin MyAddin)
{
_theAddin = MyAddin;
}
}
ImportingConstructor特性为所有参数导入使用推断出的协定类型和协定名称。可以用Import特性修饰参数重写此行为。
[ImportingConstructor]
public MyClass([Import(typeof(IMySubAddin))]IMyAddin MyAddin)
{
_theAddin = MyAddin;
}
可选导入:AllowDefault
Import 特性指定部件正常运行的要求。如果导入无法得到满足,则该部件的组合将失败,并且部件将不可用。
public class MyClass
{
[Import(AllowDefault = true)]
public Plugin thePlugin { get; set; }
//If no matching export is available,
//thePlugin will be set to null.
}
导入多个对象:ImportMany
导入同一协定匹配的多个导出。
public class MyClass
{
[ImportMany]
public IEnumerable<Lazy<IMyAddin>> MyAddin { get; set; }
}
避免发现:PartNotDiscoverable
创建策略
共享:只有在部件尚不存在时才会实例化新的副本,否则它将提供现有副本。
非共享: 每次导入实例化的新副本。适用于每个导入需要其自己内部状态的部件。
[Export] //未指定创建策略(默认Any)
public class PartOne
{
//The default creation policy for an export is Any.
}
public class PartTwo //
{
[Import] //未指定创建策略(默认Any)
public PartOne partOne { get; set; } //导入和导出均(Any),因此共享PartOne
}
public class PartThree
{
[Import(RequiredCreationPolicy = CreationPolicy.Shared)] //指定Shared创建策略
public PartOne partOne { get; set; } //和PartTow共享PartOne副本
}
[Export]
[PartCreationPolicy(CreationPolicy.NonShared)] //指定NonShared创建策略
public class PartFour
{
}
public class PartFive
{
[Import]
public PartFour partFour { get; set; } //非共享
}
public class PartSix
{
[Import(RequiredCreationPolicy = CreationPolicy.NonShared)] //指定NonShared创建策略
public PartFour partFour { get; set; } //收到各自PartFour的独立副本
}
public class PartSeven
{
[Import(RequiredCreationPolicy = CreationPolicy.Shared)] //指定Shared创建策略
public PartFour partFour { get; set; } //没有创建策略为PartFour的已导出Shared,因此没人匹配
}
PartOne
未指定创建策略,因此默认值为 Any
。 PartTwo
未指定创建策略,因此默认值为 Any
。 由于导入和导出均默认为 Any
,因此将共享 PartOne
。 PartThree
指定 Shared
创建策略,因此 PartTwo
和 PartThree
将共享 PartOne
的同一副本。 PartFour
指定 NonShared
创建策略,因此 PartFour
在 PartFive
中将为非共享。 PartSix
指定一个 NonShared
创建策略。 PartFive
和 PartSix
将各自收到 PartFour
的单独副本。 PartSeven
指定一个 Shared
创建策略。 由于没有创建策略为 PartFour
的已导出 Shared
,因此 PartSeven
导入不与任何内容匹配,并且将不会得到满足。
生命周期和释放:IDisposable 和 IPartImportSatisfiedNotification
"非共享":ReleaseExport()
MEF(Managed Extensibility FrameWork) API
标签:响应 typeof min tor 动态 隐式 -shared 重复 跨程序
原文地址:https://www.cnblogs.com/ljdong7/p/12587741.html