我们开始演化出最简单的智能客户端TaskVision。从上一篇讲述的Projects项目表开始吧。
先看下我们完成后的效果:
 小菜之智能客户端(3)演化TaskVision,获取项目
先谈谈界面吧。
控件:
 MenuStrip: mainMenu 使用插入标准项
 ToolStrip:toolBar 使用插入标准项

 XPanderList:xpList
 XPander:xpProject

相信大家已经注意到了左边仿Windows效果的控件,在TaskVision中你可以找到:XPanderControl.dll。
添加到工具箱可以看到两个自定义控件:
小菜之智能客户端(3)演化TaskVision,获取项目 

我们在xpProject控件中拉入两个控件:
Lable:lblSelectProject
ComboBox:cbProjects

(一)、使用上一篇已经构建好的Web服务和强类型DataSet:DataSetProjects
Web服务:DataService.asmx
代码如下:

小菜之智能客户端(3)演化TaskVision,获取项目using System;
小菜之智能客户端(3)演化TaskVision,获取项目
using System.Data;
小菜之智能客户端(3)演化TaskVision,获取项目
using System.Data.SqlClient;
小菜之智能客户端(3)演化TaskVision,获取项目
using System.Web;
小菜之智能客户端(3)演化TaskVision,获取项目
using System.Collections;
小菜之智能客户端(3)演化TaskVision,获取项目
using System.Web.Services;
小菜之智能客户端(3)演化TaskVision,获取项目
using System.Web.Services.Protocols;
小菜之智能客户端(3)演化TaskVision,获取项目

(二)、
在本地应用程序中引用该Web服务:名称为DataWS
主窗体:MainForm

小菜之智能客户端(3)演化TaskVision,获取项目public MainForm()
}

到这里我们已经完成了一个最简单的智能客户端。
不过上面的代码有很多缺陷,比如异常处理等等。

小菜将开始演化代码了。(注意,小菜写出的代码可能会与TaskVision中的源码有些不同,这完全是个人喜好问题,两个不一样的人怎么可能写出一样的代码,而且小菜比较喜欢IssueVision中的代码风格,相信聪明的你会对比,选择你喜欢的。)

我们新建一个DataLayer类来初步封装对Web服务GetProjects方法的调用。

小菜之智能客户端(3)演化TaskVision,获取项目using System;
小菜之智能客户端(3)演化TaskVision,获取项目
using TaskVision.DataWS;
小菜之智能客户端(3)演化TaskVision,获取项目
小菜之智能客户端(3)演化TaskVision,获取项目
namespace TaskVision

其中有三个异常WebException:通常会在无法连接到服务器引发。SoapException:通常会在调用的Web服务中的Web方法中出现异常引用。Exception:未知异常。

我们现在需要一个思路,如果出现异常我们需要怎么处理呢?
我们可以在主窗体中使用DataLayer,调用GetProjects()方法,调用该方法的结果无非两种:成功,失败。成功那当然是最好了,如果失败怎么办?其一、我们需要给用户提示是出现什么错误。其二、我们应用给用户重试的机会。比如网络中断,将出现WebException错误,用户重新连接上网络,重试后,则可以正常使用该系统。

在主窗体中使用:

小菜之智能客户端(3)演化TaskVision,获取项目using System;
小菜之智能客户端(3)演化TaskVision,获取项目
using System.Collections.Generic;
小菜之智能客户端(3)演化TaskVision,获取项目
using System.ComponentModel;
小菜之智能客户端(3)演化TaskVision,获取项目
using System.Data;
小菜之智能客户端(3)演化TaskVision,获取项目
using System.Drawing;
小菜之智能客户端(3)演化TaskVision,获取项目
using System.Text;
小菜之智能客户端(3)演化TaskVision,获取项目
using System.Windows.Forms;
小菜之智能客户端(3)演化TaskVision,获取项目
小菜之智能客户端(3)演化TaskVision,获取项目
namespace TaskVision
}

在GetProjects()方法中,我们使用了一个do{}while(true)循环,只到失败或成功才结束,如果CheckResult(exceptionType)是重试则一直循环下去。

上面的代码其实已经挺漂亮了,不过我们还是应该找出不足的地方。
(一)、下面这段代码

小菜之智能客户端(3)演化TaskVision,获取项目try
}

我们可以预测到上面显示异常的代码在主窗体中将会出现在很多地方,我们可以对其进行简单的封装.

(二)、我们直接在代码中指定了异常标题和异常内容:"无法连接到服务器,请重试." 等,这会给我们的维护代码带来麻烦,所以我们可以使用常量.

改进后的代码如下:
小菜之智能客户端(3)演化TaskVision,获取项目using System;
小菜之智能客户端(3)演化TaskVision,获取项目
using System.Collections.Generic;
小菜之智能客户端(3)演化TaskVision,获取项目
using System.ComponentModel;
小菜之智能客户端(3)演化TaskVision,获取项目
using System.Data;
小菜之智能客户端(3)演化TaskVision,获取项目
using System.Drawing;
小菜之智能客户端(3)演化TaskVision,获取项目
using System.Text;
小菜之智能客户端(3)演化TaskVision,获取项目
using System.Windows.Forms;
小菜之智能客户端(3)演化TaskVision,获取项目
namespace TaskVision
}
如果我们程序发布后,Web服务的Url地址必将改变怎么办呢?
那就让我们来改造下DataLayer.
先修改app.config.将Web服务的Url地址依赖注入,方便我们以后更改Web服务的Url地址.
小菜之智能客户端(3)演化TaskVision,获取项目<?xml version="1.0" encoding="utf-8" ?>
小菜之智能客户端(3)演化TaskVision,获取项目
<configuration>
小菜之智能客户端(3)演化TaskVision,获取项目 
<appSettings>
小菜之智能客户端(3)演化TaskVision,获取项目  
<add key="DataServiceUrl" value="http://localhost/TaskVisionWS/DataService.asmx"/>
小菜之智能客户端(3)演化TaskVision,获取项目 
</appSettings>
小菜之智能客户端(3)演化TaskVision,获取项目
</configuration>
然后修改DataLayer代码:
小菜之智能客户端(3)演化TaskVision,获取项目using System;
小菜之智能客户端(3)演化TaskVision,获取项目
using TaskVision.DataWS;
小菜之智能客户端(3)演化TaskVision,获取项目
小菜之智能客户端(3)演化TaskVision,获取项目
namespace TaskVision
好了,让我们来测试下程序对异常的处理能力吧:
(一)、先来测试WebException。怎么测呢?将IIS停止就可以了。这样我们的程序就无法访问到服务器了。
小菜之智能客户端(3)演化TaskVision,获取项目 
你可以点击否。则GetProjects()返回false,则抛出无法加载项目的异常。
小菜之智能客户端(3)演化TaskVision,获取项目 
你也可以启动IIS,点击是,则重试,则程序正常运行。

(二)、让我们来测试SoapException。怎么测呢?在调用的Web方法中抛出异常。
小菜之智能客户端(3)演化TaskVision,获取项目[WebMethod]
小菜之智能客户端(3)演化TaskVision,获取项目
public DataSetProjects GetProjects()
}
小菜之智能客户端(3)演化TaskVision,获取项目 
点击是进行重试,点击否则提示
小菜之智能客户端(3)演化TaskVision,获取项目

今天就先到这里吧。


相关文章: