C#可擴展編程之MEF學習筆記(四):見證奇跡的時刻
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; }
}
}