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 {  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   " 张三 " ;
        }
    }
}
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值