EBMIDE——服务脚本IOS

 

 

IOS简介

IOS是In/Out Script(输入/输出脚本)的简称,在我的设计中,用in,out,script3个节点来描述一个服务调用。

 

前言

之前,想到这样一个情景,用一个脚本来描述一个服务的操作,这样做的好处是,业务逻辑落到了配置文件。业务变化时只需通过修改配置,而不需要重新编译系统。

最近几天,由于工作需要,转到了服务器的研发,刚好碰上这一应用场合,终于有机会完成这一脚本的设计。

设计目标

采用XML作为服务的描述语言,因为目前XML解析的库已非常完善,采用XML能够省去大量的语法解析工作;

一个服务对外界的元素是输入参数和输出参数,所以定义了In,Out两个节点分别描述;

一个服务应该包含多个操作,这些操作有先后关系,赋值关系;

服务的多个操作应该支持顺序,分支,循环3个基本的执行方式;

服务执行过程中会产生临时变量,要支持临时变量的存放;

必须保证服务的多个操作的事务性;

服务的内部错误处理。

 

服务脚本节点定义

set节点

定义输入/输出参数:name参数名称

io节点

定义Invoke/Out操作:i执行脚本,o输出变量

if/elseif/else节点

定义条件执行节点:i执行判断脚本

foreach节点

定义循环遍历执行节点:i获取父项脚本,o输出子项变量

throwerror节点

定义引发异常节点:i获取异常信息脚本

error节点

定义错误处理节点

 

 

完整的服务脚本

 1 <servicename="">------【服务节点】name:服务名称
 2 
 3    <in>------【输入参数】
 4 
 5      <setname=""/>
 6 
 7    </in>
 8 
 9    <out>------【输出参数】
10 
11      <setname=""/>
12 
13    </out>
14 
15    <scriptt="false">------【服务脚本】t:transaction事务控制
16 
17      <ioi=""o=""/>
18 
19      <ioi=""o=""/>
20 
21      <ifi="">
22 
23        <ioi=""o=""/>------if结果为true时执行
24 
25        <ioi=""o=""/>
26 
27        <elseifi="">
28 
29          <ioi=""o=""/>------elseif结果为true时执行
30 
31          <ioi=""o=""/>
32 
33        </elseif>
34 
35        <else>
36 
37          <ioi=""o=""/>------if/elseif所有结果为false时执行
38 
39          <ioi=""o=""/>
40 
41        </else>
42 
43      </if>
44 
45      <foreachi=""o="">
46 
47        <ioi=""o=""/>------i值必须是可遍历的数据类型,o值是遍历时的子项
48 
49        <ioi=""o=""/>
50 
51      </foreach>
52 
53      <throwerrori=""/>------引发异常能控制事务回滚
54 
55      <error>
56 
57        <ioi=""o=""/>
58 
59        <ioi=""o=""/>
60 
61      </error>
62 
63    </script>
64 
65 </service>
66 
67  

 

服务脚本引擎

用来解析执行服务脚本,是服务器的一个子模块。

 

服务脚本例子

例子1:创建实体对象服务

<servicename="NewEntity">

<in>

   <setname="Type"/>

</in>

<out>

   <setname="New"/>

</out>

<scriptt="true">

   <ioi="CreateEntity(@Type)"o="New"/>

   <ioi="CreateDTS()"o="New.DTS"/>

   <ioi="InsertEntity(@New)"o="P1"/>

   <ifi="!@P1">

     <ioi="Null()"o="New"/>

   </if>

   <error>

     <ioi="Error()"o="New"/>

   </error>

</script>

</service>

例子2:带文件操作和数据库操作,并且有事务控制的例子

<servicename="CreateSheet">

<in>

   <setname="Template"type="string"/>

   <setname="Items"type="manifest"/>

</in>

<out>

   <setname="DTS"/>

   <setname="Error"/>

</out>

<scriptt="true">

   <!--创建文件映射?-->

   <ioi="CreateEntity('EBM.Data.File')"o="File"/>

   <ioi="CreateDTS()"o="File.DTS"/>

   <ioi="FormatDate(Date(),'yyyyMMdd')"o="File.Folder"/>

   <ioi="@File.DTS"o="File.Name"/>

   <ioi="'.fxl'"o="File.Ext"/>

   <ioi="GetDriver()"o="File.Driver"/>

   <ioi="ToFullPath(Concat(@File.Folder,'/',@File.Name,@File.Ext), @File.Driver)" o="SavePath"/>

   <!--创建文件-->

   <ioi="ToFullPath(@Template)"o="Path"/>

   <ioi="LoadSheet(@Path)"o="Sheet"/>

   <ioi="FillSheet(@Sheet, @Items)"o="Sheet"/>

   <ioi="InvokeSheet(@Sheet)"o="Sheet"/>

   <!--写文件-->

   <ioi="WriteText(@SavePath, @Sheet)"o="Success"/>

   <!--入库-->

   <ioi="InsertEntity(@File)"o="Success"/>

   <ifi="!@Success">

     <throwerrori="'错误 InsertEntity(@File)'"/>

   </if>

   <!--

   <throwerror i="'事务回滚测试'"/>

   -->

   <ioi="@File.DTS"o="DTS"/>

   <error>

     <ioi=""o="DTS"/>

     <ioi="Error()"o="Error"/>

   </error>

</script>

</service>

 精彩推荐:

一个很简单的ajax教程实例2asp动态页面部分

asp读取、写入、删除、修改xml完整实例

JQuary实现无刷新全选(取消选取)Checkbox示例源码

JQuary小技巧专辑1

posted @ 2013-11-14 15:58  笑话吧  阅读(470)  评论(0编辑  收藏  举报