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

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

阅读更多

本系列文章非原创,转载自:

作      者:Beniao

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

 

MEF可以在传统应用程序中使用(包括桌面的Winform、控制台程序和Web的ASP.NET),也可以在RIA的Silverlight中使用。在Silverlight中只是宿主的方式有所不同,实际上在Silverlight中也可以像传统应用程序中是方式去宿主 ,MEF也为Silverlight提供了独特的宿主方式,使用中需要引用System.ComponentModel.Composition.Initialization.dll动态链接库。

 

  Silverlight中提供了一种新的宿主MEF的方式,只需要在Application_Startup事件处理函数中通过调用 System.ComponentModel.CompositionInitialization程序集的 System.ComponentModel.Composition.CompositionInitializer类里面的方法一行代码就可以完成 MEF的宿主,这是非常方便、简单的。详细如下代码块:

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
private void Application_Startup(object sender, StartupEventArgs e)
{
    CompositionInitializer.SatisfyImports(this);
}
 

 

  下面用一个简单的示例程序演示下在Silverlight中的MEF的基本应用。比如编写一个日志组件,分别提供两种写日志的方式,既写文本日志和数据库日志,那么对于需要通过MEF托管的部件可以如下代码定义:

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
public interface ILogger
{
    void WriteLog(string message);
}
    
[Export("TXT",typeof(ILogger))]
public class TXTLogger : ILogger
{
    public void WriteLog(string message)
    {
        System.Console.WriteLine(message);
    }
}

[Export("DB",typeof(ILogger))]
public class DBLogger : ILogger
{
    public void WriteLog(string message)
    {
        System.Console.WriteLine(message);
    }
}
 

 

  分别将两个不同的日志记录组件都通过[ExportAttribute]进行标注为导出部件,并分别为其设置好通信契约,那么在导入他们的地方 就直接通过契约确定分别导入什么类型的日志记录实现部件。可以通过提供一个统一的门面服务以供系统中统一调用,大致如下代码所示:

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
/// <summary>
/// 门面服务,聚合不同的日志记录部件,通过MEF进行组合
/// </summary>
[Export]
public class FacadeService
{
    [Import("TXT")]
    public ILogger TXTLogger { get; set; }

    [Import("DB")]
    public ILogger DBLogger { get; set; }
}
 

 

  实际上门面服务作为一个简单、单纯的辅助类,也是可以通过MEF进行动态装配的,如上代码就将FacadeService也进行了 [ExportAttribute]标注,表示此门面类也是一个可装配的部件,那么在App 中同样可以通过[ImportAttribute]进行导入 的。

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
/// <summary>
/// 导入FacadeService
/// </summary>
[Import]
public FacadeService Service { get; set; }

 

  接下来看看如何调用,FacadeService是被导入在App中的,在应用的时候可以通过Application.Current获取到当前Silverlight的App对象,总而达到可调用被导入在App中的部件。
public MainPage()
{
    InitializeComponent();
 
    var service = (Application.Current as App).Service;
    service.TXTLogger.WriteLog("写日志到文本文件");
    service.DBLogger.WriteLog("写日志到数据库");
}
 

 

分享到:
评论

相关推荐

    Silverlight Mef Demo

    《使用MEF构建可扩展的Silverlight应用:深入解析“Silverlight Mef Demo”》 在软件开发领域,可扩展性是系统设计的关键要素之一。Microsoft Expression Blend的Silverlight技术结合Managed Extensibility ...

    MEF框架整理学习内容

    - 宿主程序中定义了一个`IBookService`类型的属性,并通过`[Import]`属性标记,表明这个属性需要由MEF自动填充。 - 通过调用`ComposeParts`方法将宿主程序和部件实例加入组合容器中,实现了部件的自动装配。 #### ...

Global site tag (gtag.js) - Google Analytics