我想做一个进销存,有好多单据对吧?都要新建保存。我在客户端只放一个socket,服务器端建一个服务器程序,一个RDataModal对吧?建了一个RdataModal肯定就有了一个接口对吧(比如叫IServer)?接口里写好多函数,不好维护我觉得,而且太多,比如采购单保存、销售单保存什么的,所以我想建再建一个接口叫IBill,有几个函数新建、保存。这样我再在Iserver接口下建一个函数GetInterFaceByID参数是单据类型,返回类型为IBill,这个GetInterFaceByID函数实现功能为:根据不同的单据类型来实例化IBIll接口,这样客户端调用的时候就只用这样作了
var tt:IBill
  tt:=socket.appserver.getinterfacebyID(单据类型);
  tt.新建;
  tt.保存;
不知道我说明白了没?
现在有两个问题是这个的关键第一个怎么实例化IBill;第二个是怎么返回这个接口。

解决方案 »

  1.   

    楼主的意思我明白,曾经有类似的帖子问过类似的问题,试图通过SocketConnection返回其它接口,但是你们忽略了SocketConnection的工作原理,它只是把RPC调用封装成数据包然后让远程的SocketServer负责COM对象的创建调用等,因此一个SocketConnection只能负责一个RDM,楼住要想按照自己的要求做,需要实现接口的聚集,而且中间的数据传输必须使用低层的DCOM而非TCP/IP,既然选择了RAD我想这些工作实在是复杂了些,我到有个稍好些的方法:
    你需要为每个业务模块建立一个RDM,在客户端实现如下的调用机制----
    Type
      TServerType=(stSale,stBuy,stPay);
      TServerInfo=record
        ServerAddress:String;
        ServerPort:Integer;
        ServerGUID:String;
      end;
    var
      ServerArray:array[TServerType] of TServerInfo=((ServerAddress:'192.168.0.1';
                                                      ServerPort:221;
                                                      ServerGUID:'{44ED6A79-DD3D-475E-ABA5-FD819B05BDF8}'),
                                                      (ServerAddress:'192.168.0.1';
                                                      ServerPort:221;
                                                      ServerGUID:'{C69807DC-6FE1-4C09-946D-6E361852B08B}'),
                                                      (ServerAddress:'192.168.0.2';
                                                      ServerPort:221;
                                                      ServerGUID:'{76345686-1FD7-4E58-A24E-CC75B735A0CA}')
                                                      );
    function GetServerConnection(ServerType:TServerType):TSocketConnection;
    begin
      Result:=TSocketConnection.Create(nil);
      try
        with Result do
        begin
          Host:=ServerArray[ServerType].ServerAddress;
          Port:=ServerArray[ServerType].ServerPort;
          ServerGUID:=ServerArray[ServerType].ServerGUID;
          Open;
        end;
      except
        on E:Exception do
        begin
          Result.Free;
          Result:=nil;
          raise Exception.Create('不能创建“'+ServerArray[ServerType].ServerGUID+'”服务');
        end;
      end;
    end;
    ///今后每当新建业务模块时只需调用这个函数产生对应服务连接即可,比如现在需要创建销售模块那么下面的调用会完成这个功能:
    var
      SaleConnection:TSocketConnection;
    ....
    ....
    ...
       SaleConnection:=GetServerConnection(stSale);
     .....
       SaleConnection.AppServer.NewSaleTraffic;
       .....
    //相信我以上的代码能够给楼主带来一点帮助。
      

  2.   

    一个SoketConnection只能负责一个远程对象服务,所以导致了创建远程对象时频繁连接,不过还是有办法削弱这种情况的,服务器端可以使用Pooling机制,这方面的用例随处可见;而客户端也可以使用相同的技术,使用连接缓冲,再加上SocketConnection 的强项就是连接速度快(另一个就是穿透性好)。再者,无论你使用那种技术只要新建远程对象就会创建连接,无论采用哪中技术。
      

  3.   

    接着问:如果这样,是不不必须一个socket释放后或者断开后才能再新建一个连接,如果端口都是211的话?