假定您已经重新创建了我的应用程序设计,或者从我提供的 ApplicationDesigner.ad 文件加载了该程序,那么您现在可以尝试着实现这些应用程序。使用相关的语言设置要实现的每个应用程序,然后右键单击此关系图的空白部分并选择 Implement All Applications。
您可能希望首先复制一份 ApplicationDesign.ad 文件,这是因为一旦您实现了该文件中的应用程序,如果不重新实现所有的定义,就无法将此关系图作为另一个解决方案中应用程序设计的基础。
编码实现
尽管我已经使用 Visual Studio 为所有的应用程序生成了主干实现,但这些实现此时还不具备任何有用的功能。然而,许多困难的工作已经完成,因此使这些应用程序端到端工作不需要使用很多额外的代码,至少对于演示是这样。
让我们来看一看这些应用程序中的每一个,然后浏览我添加到每个实现中以使其正常工作的额外代码。
BureauDeChange 实现
如果回顾一下图 2,您就会看到在 BureauDeChange 应用程序项目中列出的 ExchangeRateService.asmx 文件。该文件的内容和该 Web 服务的入口点如下所示:
根据上面这段信息,我可以确定实现该服务的代码隐藏文件,并在解决方案资源管理器中定位到此文件,或者只需右键单击 .asmx 文件,然后从 Context 菜单选择 View Code。<%@ webservice class="BureauDeChange.ExchangeRateService" language="c#"
codebehind="~/Application_Code/ExchangeRateService.cs" %>
以下清单显示在服务实现的起始阶段由 Visual Studio 生成的主干代码。请注意,其中包含我输入的注释,这些注释是本系列第一部分中的摘要信息的一部分。
它包含在应该执行的 getExchangeRate 操作的方法体,所以我对此进行了修改,直接在 throw 语句前面加入了以下代码行:namespace BureauDeChange
...{
[System.Web.Services.WebServiceBinding(Name = "ExchangeRateService")]
public class ExchangeRateService : System.Web.Services.WebService
...{
/**////
/// 该操作提供 fromCurrency 和 toCurrency 之间的交易转换率。
///
/// 货币代码,如“USD”或“EUR”。
/// 货币代码,如“USD”或“EUR”。
[System.Web.Services.WebMethod(),
System.Web.Services.Protocols.SoapDocumentMethod(Binding = "ExchangeRateService")]
public double getExchangeRate(string fromCurrency, string toCurrency)
...{
throw new System.NotImplementedException();
}
}
}
为了方便起见,我选择了保留 throw 语句作为该方法的最后一行,这样,对于任何尚未实现的货币转换,都会引发 NotImplementedException。根据实际情况,这意味着可以对英镑进行双向转换,如果您有兴趣,可以在尝试这个程序时添加此功能。if (fromCurrency.Equals("USD") && toCurrency.Equals("EUR"))
return 0.78;
if (fromCurrency.Equals("EUR") && toCurrency.Equals("USD"))
return 1.28;
添加以上这些代码行并保存更改之后,我可以测试这个 Web 服务。因此,我右键单击 ExchangeRateService.asmx 文件,然后选择 View in Browser,此时会看到一个类似于图 3 的页面,只不过这次列出的是 ExchangeRateService 的 getExchangeRate 操作。
选择这个操作,进入图 4 所示的窗体,在调用此 Web 服务前,我可以使用该窗体为 fromCurrency 和 toCurrency 输入参数。
图 4. getExchangeRate Web 服务操作
![](/sourcefiles/pic/2006-8-11/image/06811090.gif)
这正是我由衷喜欢 Web 服务的一个原因 — 可以使用一个自动生成的 HTML 窗体对其进行测试,而不必首先实现一个真实的客户端。
图 5 给出了该 Web 操作调用的结果。快速回顾一下这段代码来确认这个结果 — 0.78,与我期望的完全相同。我可以重新测试该服务,方法是将“EUR”作为 fromCurrency 的参数,而将“USD”作为 toCurrency 的参数来产生结果 1.28。
图 5. getExchangeRateService 结果
![](/sourcefiles/pic/2006-8-11/image/06811064.gif)
按照我上面给出的步骤,您可以非常顺利地编写此实现的代码并对其进行测试。但是我建议,在我介绍完所有这些实现之后,您在这一部分的最后正式地尝试一次。