代码改变世界

SmartClient中Web服务接口设计(一)

2007-06-19 15:51  老羽  阅读(744)  评论(1编辑  收藏  举报

2007-06-19 14:02      SmartClientWeb服务接口设计()

 

       早期做SmartClient,设计的web服务接口比较粗,有很多弊端。写出来供大家引以为戒,然后分析弊端。

       SmartClient中,Web服务位于中间层,处于客户端(UI)与后台数据访问之间,所以当时设计就是为了传输数据,设计了如下接口:

    public interface IDataProvider

    {

        DataSet Select(object[,] Parameters);

        DataSet Update(DataSet entity);

}

 

Web服务设计如下(省略SoapHeader及其它作用的方法)

[WebService(Namespace = "http://www.w3c.org/")]

[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服务接口呢?下次再详细讲.