`
jiasongmao
  • 浏览: 671164 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

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

阅读更多

本文章非原创,转载自:

作      者:Beniao

文章出处:http://beniao.cnblogs.com/   或  http://www.cnblogs.com/

 

在MEF中,使用[System.ComponentModel.Composition.ExportAttribute]支持多种级别的导出部 件配置,包括类、字段、属性以及方法级别的导出部件,通过查看ExportAttribute的源代码就知道ExportAttribute被定义为 Attribute,并为其设置了使用范围。

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
[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中组合部件(Composable Parts)与契约(Contracts)的基本应用 》,下面为演示代码:

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
[System.ComponentModel.Composition.Export]
public class DBLogger
{
}

 
 

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

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
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方法,且带有一个字符 串类型参数,此时就可以通过匿名委托进行形参的和方法的导出。

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
public class BookService
{
    [Export(typeof(Action<string>))]
    public void PrintBookName(string name)
    {
        Console.WriteLine(name);
    }
}
 

 

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

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
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]实现基于继承的导出,其他 的和字段、属性、方法级的应用完全一致,下面的代码演示了基于继承的导出与导出应用。

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
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英文版程序设计指南介绍。

分享到:
评论

相关推荐

    C# MEF使用实例

    MEF通过引入元数据(Metadata)和导出(Exports)与导入(Imports)的概念,允许代码之间进行松散耦合,从而增强了软件的灵活性和可维护性。 ### 1. MEF的核心概念 #### 导出(Exports) 导出是MEF中的关键概念,...

    MEF+WPF Demo

    它通过元数据(metadata)和导出(exports)与导入(imports)的概念,实现了组件之间的松耦合。 **WPF(Windows Presentation Foundation)** 是.NET Framework的一部分,用于构建具有丰富图形界面的桌面应用程序...

    MEF简单模型

    通过使用特性标记,可以在类的成员上声明导入。 3. **导出(Exports)**:当一个部件提供了一个可以被其他部件使用的功能或数据时,我们就说它进行了导出。同样,导出也是通过特性来标记的。 4. **容器(Container...

    Managed Extensibility Framework(MEF)

    这些部件可以包含导出(Exports)和导入(Imports)。 2. **导出(Exports)**:部件提供给其他部件使用的功能或数据。通过使用 `[Export]` 属性标记,你可以指定一个类型或成员作为导出。例如,你可以导出一个实现...

    扩展性MEF.rar111

    2. **导出(Exports)**: 部件通过使用`[Export]`特性标记成员(如类、方法或属性),声明它可以提供给其他部件使用。 3. **导入(Imports)**: 部件通过使用`[Import]`或`[ImportMany]`特性标记成员,声明它对其他...

    MEF学习Demo

    3. **导入(Imports)**:如果一个部件需要依赖其他部件的服务,它可以通过`[Import]`或`[ImportMany]`特性声明导入。`[Import]`用于单一依赖,`[ImportMany]`则用于一组依赖。 4. **目录(Catalogs)**:目录是MEF...

    MEFTraining.CPC.rar

    10. **Composable Parts(可组合部件)**:这是MEF设计模式中的关键概念,意味着任何.NET对象都可以是一个Part,只要它声明了导入和导出。 MEFTraining.CPC.rar中的内容可能包括了MEF的教程、示例代码、练习以及...

    MEFDemo_SL

    3. **导入(Imports)**:通过使用`[Import]`或`[ImportMany]`特性,组件可以声明对其他导出的依赖。MEF会自动匹配这些依赖并注入适当的组件实例。 4. **容器(Container)**:MEF的容器负责管理所有组件的生命周期...

    MEFCatalogs.rar

    综上所述,"MEFCatalogs.rar"的"006 MEF Catalogs"文件可能会涵盖这些主题,详细解释如何使用MEF来创建可扩展的应用程序,以及如何设计和管理Catalogs来实现部件之间的协作。学习和理解MEF Catalogs对于构建模块化、...

    MEFTraining.MefCatalogs.rar

    综上所述,`MEFTraining.MefCatalogs.rar`可能是关于如何使用和理解MEF框架的一系列教程或示例代码,涵盖了MEF的各个方面,包括Catalogs的创建和管理、部件的导入导出、元数据使用、CompositionContainer的应用以及...

    .NET 4.0 MEF常见问题解答(插座,插头和扩展名)

    2. **导入(Imports)**:导入使用 `[Import]` 或 `[ImportMany]` 属性来声明一个类需要依赖的导出。单个导入(Single Import)用 `[Import]` 表示,可以匹配一个导出;多个导入(Multiple Import)用 `[ImportMany]...

Global site tag (gtag.js) - Google Analytics