zoukankan      html  css  js  c++  java
  • 【转】MEF程序设计指南二:Silverlight中使用CompositionInitializer宿主MEF

      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的宿主,这是非常方便、简单的。详细如下代码块:

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        CompositionInitializer.SatisfyImports(this);
    }

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

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

    /// <summary>
    /// 门面服务,聚合不同的日志记录部件,通过MEF进行组合
    /// </summary>
    [Export]
    public class FacadeService
    {
        [Import("TXT")]
        public ILogger TXTLogger { getset; }

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

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

    /// <summary>
    /// 导入FacadeService
    /// </summary>
    [Import]
    public FacadeService Service { getset; }

      接下来看看如何调用,FacadeService是被导入在App中的,在应用的时候可以通过Application.Current获取到当前Silverlight的App对象,总而达到可调用被导入在App中的部件。

    public MainPage()
    {
        InitializeComponent();
     
        var service = (Application.Current as App).Service;
        service.TXTLogger.WriteLog("写日志到文本文件");
        service.DBLogger.WriteLog("写日志到数据库");
    }
  • 相关阅读:
    vector<vector<int>> 判断三个数为一组是否重复
    数位dp——hdu2089不要62
    nyoj1099 四点坐标判断正方形
    构造回文——最长公共子序列问题 java
    nyoj08 一种排序
    记录一个protobuf枚举类型引发问题的分析和思考
    记录一下996.icu
    Android N requires the IDE to be running with Java 1.8 or later
    使用fresco后引发的关于造轮子的思考
    使用了一段时间的instant run 记录一下遇到的问题
  • 原文地址:https://www.cnblogs.com/PatrickLiu/p/6611205.html
Copyright © 2011-2022 走看看