C#可擴充套件程式設計之MEF學習筆記(四):見證奇蹟的時刻

雲霏霏發表於2014-08-28

  前面三篇講了MEF的基礎和基本到匯入匯出方法,下面就是見證MEF真正魅力所在的時刻。如果沒有看過前面的文章,請到我的部落格首頁檢視。

  前面我們都是在一個專案中寫了一個類來測試的,但實際開發中,我們往往要採用分層架構,就拿最簡單的三層架構來說吧,我們通常把業務邏輯寫在DLL中,現在就來寫一個例子,看看如何在不編譯整個專案的情況下,輕鬆的實現擴充套件。先透露一下,我們只要新增一個DLL就可以了。

  這裡就以銀行為例子吧,首先新建一個控制檯專案,還叫MEFDemo吧,然後建一個類庫寫介面,然後再建一個類庫實現介面。專案結構如下:

MEFDemo和BankOfChina都只引用介面專案,MEFDemo不需要引用BankOfChina。

BankInterface的程式碼如下,做個簡單例項,寫幾個方法測試一下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BankInterface
{
   public interface ICard
   {
      //賬戶金額
      double Money { get; set; }
      //獲取賬戶資訊
      string GetCountInfo();
      //存錢
      void SaveMoney(double money);
      //取錢
      void CheckOutMoney(double money);
   }
}

這裡新增一箇中國銀行卡,實現介面,引用名稱空間什麼的不再重複說了,不懂看前面的文章,程式碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BankInterface;
using System.ComponentModel.Composition;

namespace BankOfChina
{
   [Export(typeof(ICard))]
   public class ZHCard : ICard
   {
      public string GetCountInfo()
      {
         return "Bank Of China";
      }

      public void SaveMoney(double money)
      {
         this.Money += money;
      }

      public void CheckOutMoney(double money)
      {
         this.Money -= money;
      }

      public double Money { get; set; }
   }
}

然後編寫主程式,程式碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using BankInterface;

namespace MEFDemo
{
   class Program
   {
      [ImportMany(typeof(ICard))]
      public IEnumerable<ICard> cards { get; set; }

      static void Main(string[] args)
      {
         Program pro = new Program();
         pro.Compose();

      foreach (var c in pro.cards)
      {
         Console.WriteLine(c.GetCountInfo());
      }


         Console.Read();
      }

      private void Compose()
      {
         var catalog = new DirectoryCatalog("Cards");
         var container = new CompositionContainer(catalog);
         container.ComposeParts(this);
      }
   }
}

現在,我們知道只有一種銀行卡,及中國銀行的,注意我標紅的程式碼,這裡是一個目錄,及主程式所在目錄的Cards資料夾,我們把生成的BankOfChian.dll拷貝到這個資料夾下,然後執行才可以正確輸出資訊(畢竟我們沒有引用那個專案),如圖:

到了這裡相信大家已經明白了,如果現在需求改變了,需要支援建行、農行等銀行卡,怎麼辦呢?通常我們要改專案,把整個專案都編譯再重新發布。但是現在不需要這麼做了,我們只需要新增一個類庫專案,把生成的dll拷貝到Cards目錄下即可。

我們在這個解決方案下繼續新增一個類庫專案,實現ICard介面,程式碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.Composition;
using BankInterface;

namespace NongHang
{
   [Export(typeof(ICard))]
   public class NHCard : ICard
   {
      public string GetCountInfo()
      {
         return "Nong Ye Yin Hang";
      }

      public void SaveMoney(double money)
      {
         this.Money += money;
      }

      public void CheckOutMoney(double money)
      {
         this.Money -= money;
      }

      public double Money { get; set; }
   }
}

點選右鍵編譯,把生成的dll拷貝到Cards目錄下面,執行看到如下結果:

再看看Cards目錄中,現在你新增幾個dll,就會顯示多少條資訊了。

原始碼下載

 

MEF系列文章:

 C#可擴充套件程式設計之MEF學習筆記(一):MEF簡介及簡單的Demo

C#可擴充套件程式設計之MEF學習筆記(二):MEF的匯出(Export)和匯入(Import)

C#可擴充套件程式設計之MEF學習筆記(三):匯出類的方法和屬性

C#可擴充套件程式設計之MEF學習筆記(四):見證奇蹟的時刻

C#可擴充套件程式設計之MEF學習筆記(五):MEF高階進階

 

相關文章