《模式——工程化实现及扩展》(设计模式C# 版)《适配器模式 Adapter》——“自我检验"
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>
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级联的方式,完成报文抓取到消息入库的过程