zoukankan      html  css  js  c++  java
  • 【转】MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)

      在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中组合部件(Composable Parts)与契约(Contracts)的基本应用》,下面为演示代码:

    [System.ComponentModel.Composition.Export]
    public class DBLogger
    {
    }

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

     
    namespace MEFTraining.ExmprtImport
    {
        public partial class MainPage : UserControl
        {
            [Import("Name")]
            public string BookName { getset; }

            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 { getset; }

        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 { getset; }

            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英文版程序设计指南介绍。

  • 相关阅读:
    手机浏览器跳转APP
    js识别用户设备是移动端手机时跳转到手机网站
    input文字颜色、光标颜色
    vue和微信小程序的区别、比较
    vue-router query和params传参(接收参数),$router、$route的区别
    vue父子组件、兄弟组件之间的通信和访问
    利用Everything开启http服务测试移动端浏览器环境
    Vue基础知识简介
    关于Vue的一些小技巧
    Flume环境安装
  • 原文地址:https://www.cnblogs.com/PatrickLiu/p/6626068.html
Copyright © 2011-2022 走看看