轉自:《模式——工程化實現及擴充》(設計模式C# 版)
http://www.cnblogs.com/callwangxiang/
MarvellousWorks公司最近開始向大客戶提供後台接入服務,允許客戶通過該服務與其多個線上業務進行B2B整合。
大體處理流程如下:
1) 客戶通過訊息佇列將請求以報文的形式發給MarvellousWorks公司的“佇列服務平台”。
2) 為了安全考慮,“訊息平台”的處理邏輯主動從“佇列服務平台”抓取最新提交的報文。
3) 抓取新報文後,“訊息平台”對報文進行拆解,讀取其中的資訊並驗證其有效性。
4) “訊息平台”將拆解並驗證有效地報文資訊寫入資料庫
限制:
1) 報文資料均為XML格式,其 XML Schema預先由MarvellousWorks定義並發布,各家客戶遵照執行
2) 由於客戶使用的隊列產品各異,所以“佇列服務平台”計劃支援微軟MSMQ和IBM MQ,後續還可能支援ORACLE的Advanced Queue和BEA的MessageQ。
3) 由於MarvellousWorks的各個線上業務建立時間不同,所以資料庫既有ORACLE、也有MySQL和SQL Server。
現在由你作為架構師設計“訊息平台”的服務程式。
1、 隊列提供者和資料庫提供者的定義如下:
/// <summary>
/// 隊列提供者
/// </summary>
interface IQueue
{
XmlDocument Peek();
XmlDocument Dequeue();
}
/// <summary>
/// 各線上業務資料實體的基類
/// </summary>
abstract class EntryBase { }
/// <summary>
/// 這裡為了簡化樣本,將所有業務實體寫如資料庫前轉換為ADO.NET內建的DataRow類型
/// </summary>
interface IEntryDataConverter
{
DataRow ToDataRow(EntryBase entry);
}
/// <summary>
/// 資料庫提供者
/// </summary>
interface IDatabase
{
IEntryDataConverter DataConverter { get; set; }
void Write(EntryBase entry);
void Write(IEnumerable<EntryBase> entries);
}
2、 請用本章介紹的適配器模式設計“訊息平台”處理介面,並用建立一個簡單的原型,通過單元測試驗證你的思路。
3、 由於報文資料種類眾多,請用本章介紹的資料適配機制配合上面的訊息處理介面完成一個資料適配原型,並通過單元測試驗證。
提示:
為保持“訊息平台”處理邏輯的穩定,建議考慮Adapter-Adapter級聯的方式,完成報文抓取到訊息入庫的過程