易轩

持续做有意义的事

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

最近有个项目,为了使它的实现能够得到最大限度的复用,在设计时采用了SOA的架构。从层次上将其分离为应用服务(AS)和设备服务(DS),并都用WCF服务来实现。这样在以后的项目中只需根据实际硬件配置修改DS就能使用。 

采用这种架构的确有很多优势,只是实现时对于服务的要求更高:松耦合、更稳定、对于异常的补偿策略足够完善等等。项目中UI必须以Client的形式登录到AS,这样当AS检测到有Client登录后,就会把最新的业务数据和状态数据在AS“认为必要”的时候“推”给Client显示。另外,需要访问数据库时UI需要调用AS发布的数据访问接口。 

将数据访问发布成WCF服务类似于下面这个Demo 

1、 服务契约(Service Contact

Service Contact声明在IDataAccessor.cs文件中,发布了单条、批量记录的查询和修改的接口。声明如下:

 

服务契约:数据访问接口

 

Service Contact在服务端和客户端均要引用。

 

2、 数据契约(Data Contact

Data Contact声明在TestWCF.cs文件中,该文件可用前面的工具生成。Data Contact在服务端和客户端也都要引用。

 

3、 服务的实现

DataAccessor.cs文件中实现了服务契约中规定的4个接口。其中主要是对OleDbDataAccessor的方法的再次封装。

 

4、 服务的承载

App.Config的“<system.serviceModel>”标记中添加WCF服务端的配置,包括服务的名称、地址、绑定方式以及实现的Service Contact的完整名称等等。例子中使用的netTcpBinding。另外,实现服务的对象需要被实例化并在ServiceHost中承载,才能供客户端访问,这一过程在Program.cs中完成。

 

5、 客户端的实现

客户端通过代理类来访问WCF服务,代理类的编写比较“机械”,在DataAccessorProxy.cs中完成,并在App.Config的“<system.serviceModel>”标记中添加WCF客户端的配置,告知代理类在哪能访问到服务。完后就可以在界面逻辑中通过代理来调用服务端发布的服务了。

 

Demo中在WCF服务下将前面的Demo又实现了一遍,由于ClientServer端实际是由Tcp连接,为了避免Tcp连接断开的异常,Client端实现了自动重连。 

完整的源码工程可点此处下载。

posted on 2009-06-08 10:18  易轩  阅读(1325)  评论(0编辑  收藏  举报