MEF(Managed Extensibility FrameWork) API
2021-03-12 14:27
标签:响应 typeof min tor 动态 隐式 -shared 重复 跨程序 作用:创建可扩展的轻量级应用程序的库。可以让扩展在程序内重复使用,还可以跨程序重复使用。 导出Export:把部件放到容器中,供其它部件使用。 导入Import:把部件从容器中拿出来使用。 导入和导出必须具有相同的约定:协定类型参数 && 协定名称参数 隐式协定:协定类型参数和协定名称参数将从修饰的属性推断而出。 导出的类型必须与协定类型相同、派生自协定类型,或者实现协定类型接口。 协定类型:IMyAddin 协定名称:依据该协定类型创建的唯一字符串。 协定类型:IMyAddin 协定名称:从协定类型推断而出的。 协定类型:MyLogger MyClass : 协定类型:MajorRevision 协定名称:MajorRevision 导入和导出方法 动态导入: 在某些情况下,导入类可能需要与具有特定协定名称的多个导出匹配。 延迟导入:Lazy 在某些情况下,导入类可能需要间接引入导入的对象,因此不会立即实例化该对象。 必备导入:ImportingConstructor 导出的MEF部件通常由组合引擎创建,以响应填写匹配的导入的直接请求或需求。 ImportingConstructor特性为所有参数导入使用推断出的协定类型和协定名称。可以用Import特性修饰参数重写此行为。 可选导入:AllowDefault Import 特性指定部件正常运行的要求。如果导入无法得到满足,则该部件的组合将失败,并且部件将不可用。 导入多个对象:ImportMany 导入同一协定匹配的多个导出。 避免发现:PartNotDiscoverable 创建策略 共享:只有在部件尚不存在时才会实例化新的副本,否则它将提供现有副本。 非共享: 每次导入实例化的新副本。适用于每个导入需要其自己内部状态的部件。 生命周期和释放:IDisposable 和 IPartImportSatisfiedNotification "非共享":ReleaseExport() MEF(Managed Extensibility FrameWork) API 标签:响应 typeof min tor 动态 隐式 -shared 重复 跨程序 原文地址:https://www.cnblogs.com/ljdong7/p/12587741.htmlpublic class MyClass
{
[Import]
public IMyAddin MyAddin { get; set; }
}
[Export(typeof(IMyAddin))]
public class MyLogger : IMyAddin { }
[Export]
public class MyLogger : IMyAddin { }
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;
}
public class MyClass
{
[Import] //Contract name must match!
public Func
public class MyAddin
{
//Explicitly specifying a generic type.
[Export(typeof(Func
public class MyClass
{
[Import("TheString")]
public dynamic MyAddin { get; set; }
}
[Export("TheString", typeof(IMyAddin))]
public class MyLogger : IMyAddin { }
[Export("TheString")]
public class MyToolbar { }
public class MyClass
{
[Import]
public Lazy
[Export(typeof(IMyAddin))]
public class MyLogger : IMyAddin { }
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]
public MyClass([Import(typeof(IMySubAddin))]IMyAddin MyAddin)
{
_theAddin = MyAddin;
}
public class MyClass
{
[Import(AllowDefault = true)]
public Plugin thePlugin { get; set; }
//If no matching export is available,
//thePlugin will be set to null.
}
public class MyClass
{
[ImportMany]
public IEnumerable
[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
导入不与任何内容匹配,并且将不会得到满足。
下一篇:linux dd win
文章标题:MEF(Managed Extensibility FrameWork) API
文章链接:http://soscw.com/index.php/essay/63705.html