您的位置:首页 > 其它

MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)

2014-07-29 14:09 459 查看
在MEF中,使用[System.ComponentModel.Composition.ExportAttribute]支持多种级别的导出部件配置,包括类、字段、属性以及方法级别的导出部件,通过查看ExportAttribute的源代码就知道ExportAttribute被定义为Attribute,并为其设置了使用范围。
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes")]

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Method,

AllowMultiple = true, Inherited = false)]

public class ExportAttribute : Attribute

{

//......

}

  当任何一个类对象或是其内部的字段、属性、方法需要作为可组合部件的时候,就可以使用[ExportAttribute]将其标注为可导出部件。比如需要将一个对象做为可组合部件进行导出(就是类级别的导出),只需要在类上添加[ExportAttribute]就行了,详细的应用可参考《MEF中组合部件(ComposableParts)与契约(Contracts)的基本应用》,下面为演示代码:
[System.ComponentModel.Composition.Export]

public class DBLogger

{

}

  对于字段、属性级别的导出同类是一样的,通样使用[ExportAttribute]进行标注,下面代码块演示了一个完整的属性导入与导出的示例。
namespace MEFTraining.ExmprtImport

{

public partial class MainPage : UserControl

{

[Import("Name")]

public string BookName { get; set; }

public MainPage()

{

InitializeComponent();

CompositionInitializer.SatisfyImports(this);

MessageBox.Show(BookName);

}

}

public class BookService

{

[Export("Name")]

public string BookName

{

get { return "《MEF程序设计指南》"; }

}

}

}

  方法级的导入与导出主要是利用委托实现,既Action或Action<T>,其使用也是非常简单的,无论是方法所需的参数还是返回值,都可以通过匿名委托去实现。如下代码中定义了一个BookService类,里面通过MEF导出了PrintBookName方法,且带有一个字符串类型参数,此时就可以通过匿名委托进行形参的和方法的导出。
public class BookService

{

[Export(typeof(Action<string>))]

public void PrintBookName(string name)

{

Console.WriteLine(name);

}

}

  在需要使用到此方法的地方,只需要通过匿名委托的方法对该方法进行导入就可以了,下面的代码是对上面的导出方法的调用示例。
public partial class MethodExportImport : UserControl

{

[Import(typeof(Action<string>))]

public Action<string> PrintBookName { get; set; }

public MethodExportImport()

{

InitializeComponent();

CompositionInitializer.SatisfyImports(this);

PrintBookName("《MEF程序设计指南》");

}

}

  另外,MEF也支持继承的导入与导出应用,使用[System.ComponentModel.Composition.InheritedExportAttribute]实现基于继承的导出,其他的和字段、属性、方法级的应用完全一致,下面的代码演示了基于继承的导出与导出应用。
namespace MEFTraining.ExmprtImport

{

public partial class InheritedExportImport : UserControl

{

[Import]

public IUserServie UService { get; set; }

public InheritedExportImport()

{

InitializeComponent();

CompositionInitializer.SatisfyImports(this);

string name = UService.GetUserName();

}

}

[InheritedExport]

public interface IUserServie

{

string GetUserName();

}

public class UserService : IUserServie

{

public string GetUserName()

{

return "张三";

}

}

}

MEF还支持构造方法参数的导入,详细这里就不介绍了,有兴趣的可直接查询MEF英文版程序设计指南介绍。

 注:本文参考与MEF英文版程序设计指南,详细请查阅:Declaring
Exports 、Declaring
Imports
MEF官方网站:http://mef.codeplex.com/
  推荐指南:MEF程序设计指南一:在应用程序中宿主MEF



MEF程序设计指南二:Silverlight中使用CompositionInitializer宿主MEF

MEF程序设计指南三:MEF中组合部件(ComposableParts)与契约(Contracts)的基本应用



相关说明


本文属学习笔记文章,愿与有志者共同学习交流。欢迎转载,但请在明显地位标记本文的原文连接。
作 者:Beniao
文章出处:http://beniao.cnblogs.com/
http://www.cnblogs.com/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐