技术开发 频道

浅析Web Service适配器

 

4、定义作为客户程序的消费者 Web Service


UML Consumer Web Service的定义

    同时,GetQuote方法也作为Service Adapter所必需适配的接口出现(ITarget)。

5、根据消费者Web Service的需要,定义对应的Service Adapter 

    在该Adapter内部完成基于Quote.Xslt的源XML(遵循Quote.xsd)数据到目标XML(遵循QuoteTarget.xsd)的转换。

//C#
using System.Text;
using System.Xml;
using VisionTask.Training.ServicePattern.Common.Xml;
using VisionTask.Training.ServicePattern.ServiceAdapter;
namespace VisionTask.Training.ServicePattern.UtilityService.XsdAdapter
{
/// <summary>
/// XSD 适配方式下的报价服务的Service Adapter。
/// </summary>
public class QuoteXsdServiceAdapter : BaseXsdServiceAdapter, ITarget
{
/// <summary>
/// XSLT 文件需要根据Web Service 的运行位置部署。
/// </summary>
public QuoteXsdServiceAdapter() : base ("Quote.xslt"){}
public override string Name { get { return "Quote"; } }

/// <summary>
/// 数据XSD 适配。
/// </summary>
public System.Xml.XmlDocument GetQuote(string company, string id)
{
XmlDocument source = (new ProducerService()).GetQuote(company, id);
// 由于基于XSLT 对符合不同XSD 的XML 过程很固定,因此Transform 过程,
// 方在抽象基类BaseXsdServiceAdapter 中完成。
return base.Transform(source);
}
}
}

6、借助抽象的 ITarget,实现消费者 Web Service

//C#
using System.Xml;
using System.Web.Services;
using System.Web.Services.Protocols;
namespace VisionTask.Training.ServicePattern.UtilityService.XsdAdapter
{
/// <summary>
/// 客户Web Service。
/// 这里的XmlDocument 是遵循QuoteTarget.xsd 的数据。
/// </summary>
[WebService(Namespace = "http://www.visionlogic.com/trade")]
public class ConsumerService : System.Web.Services.WebService
{
[WebMethod]
public XmlDocument GetQuote(string company, string id)
{
// 实际项目中,该目标接口可以通过其他渠道注入。
// 这里为了示例方便,直接采用new() 方式使用实体类型。
ITarget target = new QuoteXsdServiceAdapter();
return target.GetQuote(company, id);
}
}
}
//Unit Test
using Microsoft.VisualStudio.TestTools.UnitTesting;
using UtilityService.UnitTest.XsdConsumer;
using System.Xml;
namespace UtilityService.UnitTest.XsdAdapter
{
[TestClass()]
public class ConsumerServiceTest
{
[TestMethod]
public void Test()
{
ConsumerService service = new ConsumerService();
string company = "VisoinTask";
string id = "2007-07-21";
XmlNode node = service.GetQuote(company, id);
Assert.IsNotNull(node);
// 这里的 attribute 名称与 QuoteTarget.xsd一致。
Assert.AreEqual<string>(id, node.Attributes["SequenceNo"].Value);
Assert.AreEqual<string>(company, node.Attributes["CompanyName"].Value);
}
}
}


0
相关文章