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

来源:互联网 发布:天刀捏脸数据明星 编辑:程序博客网 时间:2024/04/29 06:41

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

 

  注:本文参考与MEF英文版程序设计指南,详细请查阅:Declaring Exports 、 Declaring Imports  

  MEF官方网站:http://mef.codeplex.com/

  推荐指南:MEF程序设计指南一:在应用程序中宿主MEF

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

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 新开的厨卫店越来越没生意怎么办 淘宝积分不够领不到购物津贴怎么办 穿越火线精英集结号积分不足怎么办 天猫购物津贴领多了怎么办 车贷逾期车被开走还不清全款怎么办 孩子特别懒不爱动又胖怎么办 微信的聊天记录被限制了怎么办 门面租金交了一年对方不租了怎么办 离职后社保怎么办 无忧保专业可靠 淘宝店铺被投诉到监管局怎么办 淘宝买家每天都来店铺骚扰怎么办 电脑安装软件时解压出现问题怎么办 公婆不尊重你的父母做媳妇的怎么办 手机扣扣接收不上文件怎么办 买了商铺付了首付商铺倒闭了怎么办 宝宝刚满月不喜欢在床上睡怎么办 别人给我打了收货款不发货怎么办 业务员私收货款公司不发货怎么办 付款后商家没发货也不退钱怎么办 苹果7P修过主板耗电严重怎么办 oppo手机进水了开不了机怎么办 手机弯了变形但不影响使用怎么办 拼多多留错电话怎么办如果已经发货 苹果6手机后壳变形了怎么办 京东退货保修卡丢了怎么办 如果京东买的显示器屏碎了怎么办 在微信上买东西退货不退钱怎么办 手机分期付款不还款被起诉了怎么办 朋友用我的花呗分期不还钱怎么办 朋友用我身份证办分期不还钱怎么办 我手机号被别人绑定信用卡了怎么办 5s用不了4g网络怎么办 红米手机返回键没了怎么办 小米手机进水了开不了机怎么办 手机返回键和菜单键失灵怎么办 苹果5s指纹按键坏了怎么办 小米手机安卓系统耗电量大怎么办? 苹果5s充不进去电怎么办 苹果手机6s返回键失灵怎么办 本人被骗同时被利用骗了别人怎么办 京东取消订单后货到了该怎么办