依赖项与扩展点
依赖项
定义一个依赖项方法的语法格式如下:
@_Dependency(alias="别名"【可选,当没有给出alias时方法名及依赖项的名称】)
public|protected abstract 返回参数 方法名(入口参数表) 抛出异常列表;
如:
@_Dependency
protected abstract I_DataSource getDataSource(String _dsType) throws ThrowAble;
或者在*.ria.xml中定义,如(下例为扩展点定义,依赖项)
<?xml version="1.0" encoding="UTF-8"?>
<prolet id="websinger" title="网站管理系统(CMS)" parent="cloudsinger.cloudApps"
view="main.aq.html" class="MainBiz" icon16="icon16.gif" icon32="icon32.gif">
<subpro id="welcome" title="欢迎使用" view="welcome.aq.html" />
<subpro id="page" title="页面属性" view="profile.aq.html" class="ProfileBiz">
<subpro id="preview" title="页面预览" view="preview.aq.html" class="PreviewBiz" />
<subpro id="contentEditor" title="页面内容编辑" view="editor.aq.html"
class="EditorBiz" />
</subpro>
<subpro id="weblet" title="WEB小应用程序" icon16="weblet16.gif" />
<subpro id="defaultWeblet" title="Websinger提供的Weblet" class="MainBiz">
<subpro id="html" title="自定义HTML板块" view="html.aq.html" class="HtmlBiz">
<subpro id="editor" title="HTML编辑器" view="htmlEdit.aq.html"
class="HtmlEditBiz" />
</subpro>
<junction from="this:getWeblets"
to="cloudsinger.cloudApps/websinger:getWebletBean" />
</subpro>
<!--依赖项 -->
<dependency id="getWebletBean" title="获取WebletBean">
<output
type="org.cloudsinger.cloudApps.websinger.page.contentEditor.WebletBean"
desc="支持多重扩展" />
</dependency>
</prolet>
注意:
1)依赖项的访问控制符至少为protected,不能采用默认或者private;
2)依赖项可以在@_Dependency中以name给出依赖项的名称,这一点在同一ProletBean中存在多个同名方法时非常有用,默认情况下,
依赖项的名称为方法名;
3)当依赖项方法为非abstract方法时,若该依赖项没有被满足,则默认返回方法中的结果(即默认的实现),
这一点在单元测试时显得尤为重要;
4)ToyBricks体系支持“一个依赖项多次实现”,此时依赖项的返回应为java.util.Vector类型,如:
/**
* 【依赖项】扩展资源
*
* @return
*/
@_Dependency
protected Vector<ResourcePlusBean> getResourcePlusBean() {
return null;
}
扩展点
扩展点的语法与依赖项完全相同。两者的区别在于:依赖项“必须被满足”而扩展点则不同
RIA体系提供的默认依赖项实现及实现自定义的默认依赖项
org.cloudsinger.ria.api.I_ProletContext
返回类型org.cloudsinger.ria.api.I_ProletContext的依赖项由RIA引擎默认实现,如:
public NavigationBean getTopicTreeDS() {
NavigationBean root = NavigationBean.getRootNode("toybricks",
"ToyBricks(积木)开发平台", getContext().getLafPath()
+ "/toybricks16.gif");
@_Dependency
protected abstract I_ProletContext getContext();
注意:
I_ProletContext接口为RIA API中提供的重要的接口,其提供了大量常规的方法,如getRequest、getContextPath
等等方法,在编程时,只需要声明该依赖项即可直接使用,这为编程带来了极大的便利;
实现自定义的默认依赖项
您可能会在您的体系下实现某接口的默认实现,则您会用到Annotation:org.cloudsinger.toybricks.api._ImplementBy,
您需要以下两个步骤:
1)声明“默认依赖项”返回的接口,在接口上添加注释org.cloudsinger.toybricks.api._ImplementBy,给出默认的实现Factory,如:
@_ImplementBy(ProletContextFactory.class)
public interface I_ProletContext extends I_ComponentContext {
ToyBricks getToyBricks();
2)实现默认的Factory;如:
public class ProletContextFactory implements I_ImplementFactory{
public I_ProletContext product(I_ComponentPrototype _com) {
return (I_ProletContext)_com.$getContext();
}
}
ProletBean的关系编织
除在ria.xml中描述组件关系之外,ProletBean中亦可以通过org.cloudsinger.toybricks.api._JunctionTo来注释实现,如:
@_JunctionTo(value = "this.topicTree:getDataSource")
public NavigationBean getTopicTreeDS() {
NavigationBean root = NavigationBean.getRootNode("toybricks",
"ToyBricks(积木)开发平台", getContext().getLafPath()
+ "/toybricks16.gif");
I_ProletRegister reg = getContext().getProletRegister();
List<I_ProletRegister> chd = (List<I_ProletRegister>) reg
.getChildrenAsList();
if (chd != null) {
for (I_ProletRegister r : chd) {
if (!r.getId().equals("welcome")) {
_in(root.addChild(r.getPath(), r.getTitle()), r);
}
}
}
return root;
}
视图的源代码:
<script>
function openTopic(){
var node = $.com("topicTree").focusNode();
if(!node.isRoot()){
$.com("tabs").addTab(node.id,node.title,node.id);
}
}
</script>
<cs:Splitter id="tabPanel" style="width:100%;height:100%;">
<cs:col style="width:200px">
<cs:Tree id="topicTree" onNodeDblclick="openTopic"/>
</cs:col>
<cs:col>
<cs:TabBox id="tabs" style="width:100%;height:100%;">
<cs:tab title="欢迎使用" proletPath="welcome" />
</cs:TabBox>
</cs:col>
</cs:Splitter>
上例中描述了在ProletBean中的方法“getTopicTreeDS”满足(JunctionTo)当前页面中id为“topicTree”组件的依赖项“getDataSource”。
以下是对依赖项“视图中的topicTree组件的getDataSource”满足的等价写法:
@_JunctionTo(value = "this/tabPanel/topicTree:getDataSource")
public NavigationBean getTopicTreeDS() {
//...
}
及
@_JunctionTo(value = "view/tabPanel/topicTree:getDataSource")
public NavigationBean getTopicTreeDS() {
//...
}
在RIA体系下,视图中的组件(表现为标签(忽略属性标签),根组件为window组件)的结构构成一棵树,在本例中,组件(id=topicTree)的层次关系为:
window组件/tabPanel/topicTree
以上三种写法的区别是:
1)this.topicTree指明当前Prolet下的id为topicTree的组件(不论该组件位于窗体下组件哪个层次);
2)view/tabPanel/topicTree指明当前Prolet下,视图(view)窗体组件下id为tabPanel的组件下的id为topicTree的组件;
3)同2);
注意,ProletBean中的编织(@_JunctionTo)建议锁定在Prolet内部(如上例中ProletBean的方法满足视图中组件的依赖项),Prolet之间
的编织关系建议写在ria.xml中。
分享到:
相关推荐
在ToyBricks平台中,开发者可能会遇到以下知识点: 1. **图形化界面设计**:ToyBricks可能提供了丰富的UI组件库,使得非专业UI设计师也能创建美观的界面。 2. **事件驱动编程**:通过拖放组件并配置事件响应,...
3. **ToyBricks插件(Gradle Plugin)**:Gradle是Android开发中的主流构建工具,而插件则可以扩展其功能。ToyBricks插件是针对Gradle的定制化解决方案,它能够自动配置和管理模块间的依赖关系,以及处理模块间的...
压缩包中的“ToyBricks平台源代码许可协议.doc”文件详细说明了使用ToyBricks源代码的法律条款和条件。通常,开源项目会遵循某种开放源代码许可,如MIT、Apache 2.0或GPL等,这些许可定义了如何使用、修改和分发...
通过研究"ToyBricks"的源代码,我们可以学习如何在VC++环境中组织代码,如何用面向对象的方式思考问题,以及如何处理实时游戏中的各种挑战。这对于任何希望进入游戏开发领域的人来说都是一个很好的起点。此外,对于...
总结,bricks作为一款点对点网络测速软件,以其专业性和实用性在行业中占有一席之地。无论是网络设施的建设验收,还是日常的网络维护,bricks都能提供有力的支持,帮助用户快速准确地评估和优化网络性能。对于任何...
Bricks 方块小游戏Bricks 方块小游戏Bricks 方块小游戏Bricks 方块小游戏
在日常的网络使用中,我们可能会遇到网络慢、延迟高等问题,这时就需要用到像Bricks这样的工具来诊断和优化网络性能。 ### 一、Bricks的主要功能 1. **速度测试**:Bricks的核心功能是测量上传和下载速度。它可以...
"Bricks"是一个与字体相关的项目,从标题和描述中我们可以推测这可能是一个关于设计、图形或者排版的资源包,特别关注的是字体这一视觉元素。在IT行业中,字体不仅关乎美学,它还涉及到用户体验、可读性以及品牌识别...
3. **初始化 bricks.js**:在 JavaScript 中,创建一个新的 bricks 实例,指定容器元素和配置项,例如: ```javascript var container = document.getElementById('masonry-container'); var options = { ...
React Bricks入门香草React 该入门程序面向需要将其集成到现有React项目中的用户,而不是从Next.js入门...该应用程序通过create-react-app,TypeScript和仅添加的两个依赖项进行引导: @reach/router react-bricks
packet-bricks, 一种基于netmap的数据包分发与过滤 自述文件Packet是一个 linux/freebsd守护进程,它能够接收和分配到用户应用程序的输入流量。 它的主要职责可能包括( i ) 负载平衡。( 二) 复制和/或者( iii ) 过滤...
"toy-bricks"是一个专为开发3D游戏而设计的开源框架,它的核心特性在于采用C++编程语言,为游戏开发者提供了一套高效且灵活的工具集。该框架的命名"Bricks"寓意其如同构建游戏世界的积木,旨在帮助开发者轻松搭建起...
Scratch Bricks 入门指南 [兼容模式].pdf
《Bricks:构建网页乐趣的JavaScript游戏》 Bricks是一款基于JavaScript开发的简单网页游戏,其设计理念在于提供一种轻松愉快的用户体验,通过浏览器本地运行,无需下载安装即可享受游戏的乐趣。游戏的核心玩法是...
3. **npm (Node Package Manager)**:`npm`是JavaScript开发中的包管理工具,用于安装、管理和共享依赖项。在描述中提到的`npm install`命令用于安装项目所依赖的包,而`npm start`则通常用于启动开发服务器或编译...
打字游戏,练习用的swf,很适合初学打字的同学,试试吧。
在LEGO Bricks & Pieces 中导入零件清单(来自或 ) 添加缓存(使用 LocalStorage 或其他任何东西,只要这可以提高性能并防止对任何外部服务的滥用调用) 利用 Web Worker 更快地调用列表 使用 React 模板
4. **易于扩展**:如果你需要实现新的计算模块,只需编写一个新的砖块类并将其与其他砖块连接即可。 5. **集成优化**:框架内建了常见的优化算法,如随机梯度下降(SGD)、Adam等,可以方便地应用到模型训练中。 6...