码迷,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 未指定创建策略,因此默认值为 AnyPartTwo 未指定创建策略,因此默认值为 Any由于导入和导出均默认为 Any,因此将共享 PartOnePartThree 指定 Shared 创建策略,因此 PartTwoPartThree 将共享 PartOne的同一副本。 PartFour 指定 NonShared 创建策略,因此 PartFourPartFive中将为非共享。 PartSix 指定一个 NonShared 创建策略。 PartFivePartSix 将各自收到 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
迷上了代码!