我曾经做过一次封装,可以实现同时兼容两层结构和三层结构,程序员完全可以不知道有tuxedo的存在。我使用的一些基本技巧是:
1、高度封装Txuedo的服务头(如同main函数的那个东西),在服务头中调用业务逻辑(Pro*C函数);
2、高度封装Txuedo客户端,主要是建立连接、写输入参数到输入缓冲区,从输出缓冲区读返回结果‘
3、fml的Field采用无具体含义的,预定义100个,全部都是String类型,由封装程序顺序选择Field使用,并转换成string;
4、定义一个Tuxedo用的灵活性非常好的输入/输出参数用的结构(这一点最重要),要能够与业务逻辑的参数互相转换。
5、一定要做一个动态方法4的服务,这个用处很多啊,虽然让客户端写SQL并不是真正的三层结构,但实际中不可避免。
抛砖引玉,欢迎各位高手朝我砸砖头,并与我详细交流设计思想和源代码。
要实现1、2、4,关键是4。
只要定义好输入/输出参数用的结构,其它问题迎刃而解。我使用了C++STL的vector来做一个二维向量。
假设有一个业务逻辑叫Add(x, y, z),实现z = x + y,输入参数是x和y,输出参数是z.
我吧tuxedo的逻辑封装成这样:
1、在Client端编写一个和业务逻辑函数完全相同定义的函数,它完成:
a) x,y到tuxedo用的输入参数转换;
b) 调用tuxedo客户端封装函数;
c) tuxedo用的输出参数转换成z;
2、tuxedo客户端封装函数,它完成:
a) connect到tuxedo服务器
b) 将输入参数写到FML输入缓冲区
c) 调用tpcall
d) 从FML输出缓冲区读到输出参数
e) 断连(tpterm)
3、在tuxedo的server编写服务头,它完成:
a) 从FML输入缓冲区读输入参数
b) 调用业务逻辑封装函数CallAdd
c) 将返回参数写入FML输出缓冲区
4、编写一个业务逻辑封装函数CallAdd,它完成:
a) 将输入参数转换为x,y
b) 调用业务逻辑Add(x,y,z)
c) 将z转换为输出参数
5、编写业务逻辑函数Add(x,y,z)
上述步骤中,与tuxedo有关的步骤为2、3,是完全可以只写一次的,封装好了就不要再改变了。而第1、4步则是做简单的参数转换,任何人都可以完成。当然第5步得你自己做了,呵呵...
如果你愿意把所有的服务的输入输出参数都采用相同的参数结构,就可以省略第1、4步了。