C#可擴展編程之MEF學習筆記(四):見證奇蹟的時刻

  前面三篇講了MEF的基礎和基本到導入導出方法,下面就是見證MEF真正魅力所在的時刻。若是沒有看過前面的文章,請到個人博客首頁查看。html

  前面咱們都是在一個項目中寫了一個類來測試的,但實際開發中,咱們每每要採用分層架構,就拿最簡單的三層架構來講吧,咱們一般把業務邏輯寫在DLL中,如今就來寫一個例子,看看如何在不編譯整個項目的狀況下,輕鬆的實現擴展。先透露一下,咱們只要添加一個DLL就能夠了。編程

  這裏就以銀行爲例子吧,首先新建一個控制檯項目,還叫MEFDemo吧,而後建一個類庫寫接口,而後再建一個類庫實現接口。項目結構以下:架構

MEFDemo和BankOfChina都只引用接口項目,MEFDemo不須要引用BankOfChina。post

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; }
   }
}

而後編寫主程序,代碼以下:this

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());
      }spa


         Console.Read();
      }

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

如今,咱們知道只有一種銀行卡,及中國銀行的,注意我標紅的代碼,這裏是一個目錄,及主程序所在目錄的Cards文件夾,咱們把生成的BankOfChian.dll拷貝到這個文件夾下,而後運行才能夠正確輸出信息(畢竟咱們沒有引用那個項目),如圖:code

到了這裏相信你們已經明白了,若是如今需求改變了,須要支持建行、農行等銀行卡,怎麼辦呢?一般咱們要改項目,把整個項目都編譯再從新發布。可是如今不須要這麼作了,咱們只須要添加一個類庫項目,把生成的dll拷貝到Cards目錄下便可。htm

咱們在這個解決方案下繼續添加一個類庫項目,實現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高級進階

相關文章
相關標籤/搜索