码迷,mamicode.com
首页 > Windows程序 > 详细

MEF(Managed Extensibility FrameWork) API

时间:2020-03-28 16:30:22      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:响应   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

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!