程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> MEF程序設計指南一:在應用程序中宿主MEF

MEF程序設計指南一:在應用程序中宿主MEF

編輯:關於.NET

在應用程序中宿主MEF其實非常簡單,只需要創建一個組合容器對象(CompositionContainer)的實例,然後將需要組合的部件(Parts) 和當前宿主程序添加到容器中即可。首先需要添加MEF框架的引用,既 System.ComponentModel.Composition.dll,詳細如下代碼塊:

private void Compose()
{
     var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
     var container = new CompositionContainer(catalog);
     container.ComposeParts(this);
}

通過上面的代碼實現就可以完成MEF的宿主,實際上在使用MEF的開發過程中並不會如此簡單的應用。可能會定義一個或多個導入 (Import)和導出(Export)部件,然後通過MEF容器進行組合,其實也可以理解為“依賴注入”的一種實現。比如定義一個圖書接口和一 個接口的實現類,在此基礎上使用MEF的導入導出特性:

public interface IBookService
{
     void GetBookName();
}

/// <summary>
/// 導入
/// </summary>
[Export(typeof(IBookService))]
public class ComputerBookService : IBookService
{
     public void GetBookName()
     {
         Console.WriteLine("《Hello Silverlight》");
     }
}

如上代碼通過使用MEF的[System.ComponentModel.Composition.Export]對接口的實現進行導出設置,讓接口的實現以容器部件的方式 存在,然後通過組合容器進行裝配加載,這個過程中就包括了接口的實例化的過程。接下來就需要在MEF的宿主程序中定義一個接口的屬性 ,並為其標注[System.ComponentModel.Composition.Import]特性以實現接口實現類的導入。如下代碼塊:

/// <summary>
/// 導入接口的實現部件 (Part)
/// </summary>
[Import]
public IBookService Service { get; set; }

完成了導入導出的接口與實現的開發及特性配置,下面就剩下一步組合了,也就是本文提到的將部件和宿主程序自身添加到組合容器中 ,以實現導入(Import)和導出(Export)的組合裝配。

/// <summary>
/// 宿主MEF並組合部件
/// </summary>
private void Compose()
{
     var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
     var container = new CompositionContainer(catalog);
     //將部件(part)和宿主程序添加到組合容器
     container.ComposeParts(this,new ComputerBookService());
}

通過以上步驟就完成了MEF的宿主以及一個簡單的部件組合的應用示例,下面是本文的完整代碼示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;
namespace HostingMef
{
     public interface IBookService
     {
         void GetBookName();
     }

     /// <summary>
     /// 導入
     /// </summary>
     [Export(typeof(IBookService))]
     public class ComputerBookService : IBookService
     {
         public void GetBookName()
         {
             Console.WriteLine("《Hello Silverlight》");
         }
     }
     class Program
     {
         /// <summary>
         /// 導入接口的實現部件(Part)
         /// </summary>
         [Import]
         public IBookService Service { get; set; }

         /// <summary>
         /// 宿主 MEF並組合部件
         /// </summary>
         private void Compose()
         {
             var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
             var container = new CompositionContainer(catalog);
             //將部件(part)和宿主程序添加到組合容器
             container.ComposeParts(this,new ComputerBookService());
         }
         static void Main(string[] args)
         {
             Program p = new Program();
             p.Compose();
             p.Service.GetBookName();
         }
     }
}

注:本文參考Hosting MEF in an application,詳細請大家閱讀原文。

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved