一,缘起
工作相对比较自由, 虽然.net 从面世之时就关注了, 但是因平常写程序机会不多, 还真没写过WinForm程序.
前些日子集团公司推广一个系统, 也是用.net 写的, 就研究了一下, 发现其中使用了WCF(我不熟). 但是它的使用方式我却不敢苟同, 它的服务契约就像下面的样子:
[ServiceContract]public interface IServiceDM{ [OperactionContract] int Authenticate(...); ... [OperationContract] DataSet ServiceDMDataSet(string spName, object[] params); [OperationContract] DataSet ServiceDMDataSetSql(string SQLText); ... [OperationContract] int Test();}
Authenticate 是用于验证的, ServiceDMDataSet用于执行后台的存储过程, ServiceDMDataSetSql用于执行Sql语句.
这样使用也是和WCF的字眼很贴合, 一个纯粹的 Communication 通路, 原来的二层的面向过程的C/S 程序稍加改动就可以放到公网上使用了, 后台的数据库端口就不暴露在公网上了.
通过观察存储过程的参数, 认为后台数据库还是 Sql Server 于是我试着通过这样的接口向后台发送了几条命令, Select @@Version, 没问题, 正常, 哦是Sql Server 2008, 接着来
Select @@ServerName, ISNULL(SUSER_SNAME(), SUSER_NAME()), Db_Name()
上面的语句分别返回 数据库服务器名, 登录名, 数据库名. 天哪, 登录名竟然是sa.
二, 诞生
于是我想到, 我如果有一个能够透过WCF的Query Analyzer 就可以很方便的浏览他的数据库了, 我先在网上找了下这方面的程序, 有个现成的程序 叫Query Express 是用.net 写的, 能够访问 Sql Provider, Oracal Provider, Ole Provider, 稍加改动, 就可以实现我的目的. 但是, 读了它的代码之后, 我觉得这个程序写得并不好, 程序的各个部分还是关联的太紧, 于是我想我还是重新写一下吧, 于是有了我的这个程序, 它也能访问直连的本地MsSql数据库, 当然, 这个程序只是很mini的一个小程序. 通过做程序, 我发现Query Analyzer还是完成很多功能的. 但过了几天后, 我已经没有兴趣继续这个程序了.
三, 教条
WCF的一个目的是实现SOA, 通常使用SOA 应该将程序逻辑分成 表现层, 应用逻辑层, 领域层. 服务通常是应用逻辑层向表现层提供的. 现在, WCF只是作为 表现层 调用 后台数据库的一个通道. 是不是觉得有些另类呢?
附:
为防止破坏, 程序删除了WCF连接部分, 我的程序写得很随意, 欢迎拍砖.