Welcome

首页 / 软件开发 / WCF / WCF的内部通信服务Factory

WCF的内部通信服务Factory2014-07-03 cnblogs AaronWCF,很好,却又麻烦,很多时候不想用WCF的原因就是:用这个真麻 烦...

麻烦的地方,比如:

一堆一堆的服务配置,散落在一个一个的folder下,更新系统时容易出错

客户端除了要知道WCF Contract外,还要知道服务Provider所在位置

所以想了个办法来简化这些,主要思路是:

加入Internal Communication Service,简称ICS。用来插入自定义的中间层

编写一个Service Locator Service,用来将WCF服务提供者信息抽取统一保存 ,如:url, endpoint类型,做到wcf服务提供者位置无关性

完成后,WCF客户端(包括WCF服务内部调用了其他WCF服务的服务...)调用代 码会变成如下方式:

//不支持事务的调用方式IUser userSrv = ICSFactory.Create<IUser>();var result = userSrv.GetUserName("1", "2", "3");ICSFactory.Close(userSrv);//支持事务的调用方式string result = string.Empty;using (TransactionScope ts = new TransactionScope()){IUser userSrv = ICSFactory.Create<IUser>();IAdmin adminSrv = ICSFactory.Create<IAdmin>();result = userSrv.GetUserName("1", "2", "3");result = adminSrv.CheckPermission(100).ToString();ts.Complete();ICSFactory.Close(userSrv);ICSFactory.Close(adminSrv);}
WCF客户端的配置信息去哪了呢? A:在appSetting中,有个key,用来表示服 务配置信息文件所在路径,如:\fs oota2d.service.config,配置文件如下 :

<?xml version="1.0" encoding="utf-8" ?><A2D><ServiceLocator><Service ContractNamespace="DEsbInterface" Contract="IUser"><Url EndpointType="Tcp">net.tcp://192.168.1.100:9999/usersrv<;/Url></Service><Service ContractNamespace="DEsbInterface" Contract="IAdmin"><Url EndpointType="Tcp">net.tcp://192.168.1.100:9998/adminsrv&lt;/Url></Service></ServiceLocator></A2D>
如果调用WCF服务的客户端只有一个程序,就没多大用了,但是如果有很多客 户端程序,那就有用了,如下场景:

4台server都作为客户端进行WCF服务的调用