SmartClient中Web服务接口设计(一)
2007-06-19 15:51 老羽 阅读(742) 评论(1) 编辑 收藏 举报 早期做SmartClient时,设计的web服务接口比较粗,有很多弊端。写出来供大家引以为戒,然后分析弊端。
在SmartClient中,Web服务位于中间层,处于客户端(UI)与后台数据访问之间,所以当时设计就是为了传输数据,设计了如下接口:
public interface IDataProvider
{
DataSet Select(object[,] Parameters);
DataSet Update(DataSet entity);
}
Web服务设计如下(省略SoapHeader及其它作用的方法):
[WebService(Namespace = "http://www.w
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
public Service ()
{
}
[WebMethod]
public DataSet Select(string typeName, object[,] parameters)
{
IDataProvider provider= DataProviderFactory.CreateDataProvider(typeName);
return provider.Select(parameters);
}
[WebMethod]
public DataSet Update(string typeName, DataSet entity)
{
IDataProvider provider = DataProviderFactory.CreateDataProvider(typeName);
return provider.Update(entity);
}
}
DataProviderFactory为简单工厂,创建数据访问层中具体的子类。
public static class DataProviderFactory
{
#region Fields
private const string Customer = "customer"; //例子
#endregion
public static IDataProvider CreateDataProvider(string typeName)
{
switch (typeName)
{
case Customer:
return new CustomerDataProvider();
break;
//........................
//其它子类
default :
throw new Exception("未能创建DataProvider对象");
}
}
}
CustomerDataProvider 为数据访问层中的具体子类,从BaseProvider继承而来。如下代码(省略创建Command,表名的虚方法,以及简单的实现)
public abstract class BaseDataProvider : IDataProvider
{
#region IDataProvider Members
public virtual DataSet Select(object[,] Parameters)
{
//do something
}
public virtual DataSet Update(DataSet entity)
{
// do something
}
#endregion
#region Properties
protected virtual string UpdateTables //用于多表更新
{
get
{
return null;
}
}
#endregion
}
CustomerDataProvider为具体的子类
public class CustomerDataProvider : BaseDataProvider
{
//do something
}
客户端的设计就不介绍了,后台的设计大概如此,当然还有很多细节没有讲。这样的设计也确实是可以实现以webservice传输数据的目的。随着项目的深入,发现有时候需要用SQL语句更新数据库。这时,就改代码吧,修改DataSet Select(object[,] Parameters)。这里取巧,判断参数的[0,0]参数是否为SQL语句/存储过程,如果是则执行参数的[0,1],表示CommandText。
这样来实现了刚才的要求。
随后,又有新的变化了,执行Upate时需要返回参数,怎么办???没办法,改代码。修改接口中
DataSet Update(DataSet entity,ref object[] returnValues);
并修改基类中实现的方法,以及子类中所有的Update方法。改完后,发现也可以实现这个变化。
随着项目的深入,会面临越来越多的变化,那怎样设计一个通用,并且接口稳定的Web服务接口呢?下次再详细讲.