服务的嵌套调用
把通用的服务脚本抽出来配置成独立的子服务,然后提供给其他服务内部进行调用,这样能够避免相同逻辑的脚本重复编写。
服务嵌套调用需要注意的地方:
*服务的上下文:子服务参数的传入/传输
* 服务嵌套调用时的异常处理和事务处理
*避免互相嵌套调用产生死循环
服务嵌套调用定义
<!--service: 服务定义,name: 服务名称,debug:调试,publish:发布,transaction:事务控制-->
<service name="" debug="false" publish="false" transaction="false">
<in>
<!--set: 输入输出定义,name: 参数名称-->
<set name=""/>
</in>
<out>
<set name=""/>
</out>
<script>
<!--invoke: 调用子服务,service:子服务名称-->
<invoke service="">
<in>
<!-- i:当前服务的参数,o:子服务的输入参数-->
<ioi="" o=""/>
</in>
<out>
<!-- i:子服务的输出参数,o:当前服务的参数-->
<ioi="" o=""/>
</out>
</invoke>
<!--error: 错误处理脚本-->
<error>
<io i="" o=""/>
</error>
</script>
</service>
服务嵌套调用例子
原子服务CreateFile
<service name="CreateFile" debug="true" publish="true" transaction="false">
<comment/>
<!--输入参数-->
<in>
<set name="Name" type="string" label="文件名称"/>
</in>
<!--输出参数-->
<out>
<set name="File" type="entity" label="文件对象"/>
<set name="Error" type="string" label="错误信息"/>
</out>
<!--服务脚本-->
<script>
<io i="CreateEntity('EBM.Data.File')" o="File"/>
<io i="CreateDTS()" o="File.DTS"/>
<io i="FormatDate(Date(),'yyyyMMdd')" o="File.Folder"/>
<io i="@Name" o="File.Name"/>
<io i="'.fxl'" o="File.Ext"/>
<io i="GetDriver()" o="File.Driver"/>
<!--异常处理-->
<error>
<io i="Error()" o="Error"/>
</error>
</script>
</service>
嵌套服务调用
<service name="服务嵌套测试" debug="true" publish="true" transaction="false">
<comment/>
<!--输入参数-->
<in>
<set name="Name" type="string" label="文件名称"/>
</in>
<!--输出参数-->
<out>
<set name="File" type="entity" label="文件对象"/>
<set name="Error" type="string" label="错误信息"/>
</out>
<!--服务脚本-->
<script>
<invoke service="CreateFile">
<in>
<!-- i:当前服务的参数,o:子服务的输入参数-->
<io i="@Name" o="Name"/>
</in>
<out>
<!-- i:子服务的输出参数,o:当前服务的参数-->
<io i="@File" o="File"/>
</out>
</invoke>
<!--异常处理-->
<error>
<io i="Error()" o="Error"/>
</error>
</script>
</service>
相关文章