出了数据对象与数据表之间的关联映射可以被元数据化,还有什么可以元数据化?
MVC的三层结构,UI也可以元数据化,VIew和Form这些UI级元素同样可以通过XML语言来描述装载与触发关系,例如
这个View应该装载哪几个Form?
这个编辑Form上的文本控件应该绑定到哪个数据对象的哪个字段上?
当按下这个按钮的时候,应当触发哪个类的哪个方法?
我们想象增删读改(CRUD)这些常用逻辑框架底层能实现,如果我的需求是当客户下完订单后,自动发邮件通知我,并且发短信通知配货部门。这样的相对复杂业务逻辑,如何元数据化实现?
数据对象触发器 和 可配置的插入式服务
这个邮件和短信的触发肯定不应该在UI层实现,因为我们要考虑不管订单从何处被生成,都应触发发送邮件这个逻辑。所以这个业务逻辑应该被耦合在数据对象上,即只要有订单被生成就应当触发该逻辑。
而发邮件和发短信些种常见的可重用性逻辑,可以被定义为pluginService,例如在发邮件的Service中,收件人,标题,内容应当是API的参数,而发邮件的帐户,SMTP服务器信息相对于业务整个系统来说通常变化不大,应作为元数据接口,而如何与服务器链接来发送邮件则是具体被重用的对象逻辑了。这种设计的精妙之处我们将在下一篇文章中具体给大家分析。
这样实现刚才说的逻辑,我只需要创建一个
OrderDO_Trigger.xml的元数据文件
<PluginServiceName="OrderDO_Trigger" Description="" Package="" Class="doTriggerService" BizObjectName="collab.order.do.OrderDO">
<DOTriggerTriggerType="INSERT" >
<TriggerConditionExpression="" ExtraSearchRule="" />
<TriggerActions>
<TriggerActionAction="CallService" Immediate="Y" DelayMinutes="" RepeatMinutes="">
<ActionArgumentName="Service" Value="service.lib.userEmailService" />
<ActionArgumentName="Method" Value="sendEmail" />
<ActionArgumentName="RecipientEmail" Value="{@profile:Email}" />
<ActionArgumentName="EmailTemplate" Value="OrderConfirmEmail" />
</TriggerAction>
</TriggerActions>
</DOTrigger>
</PluginService>
当"INSERT" 事件发生的时候,调用发邮件服务,收件人为用户的邮箱,邮件内容模板为OrderConfirmEmail
到现在为止,一行代码都没写就把这个典型的业务逻辑用元数据的方式描述了出来。而用传统开发方式,处理这样的问题,150行以上代码的工作开销是怎么也避免不了的。而且可读性还不一定这样清晰。
说到这里,本人太喜欢Openbiz这只飞鸟(我是说他的Logo)了,感觉像是给PHP插上的翅膀。
现在我们PHPer可以对Java说,PHP现在能描述业务逻辑,你Java无非只能是数据映射和配置信息吧。
Openbiz 元数据编程 与 Zend命名规则匹配编程 的比较
本文介绍的Openbiz这种元数据思想并非唯一,如果单纯就数据对象的抽象化而言,还有一种不得不提的先进模式,叫命名规则匹配模式。这种也是Java的一种扩展。翻译成php实现方法,例如:
$obj = new stdDataObj($tableName);
$obj->name='ABC';
$obj->attribute_1 = 123;
$obj->attribute_2 = 456;
$obj->save();