`

ToyBricks中的依赖项与扩展点

阅读更多

依赖项与扩展点

依赖项

定义一个依赖项方法的语法格式如下:

 

@_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中。

 

 

 

 

分享到:
评论
1 楼 peter2009 2011-10-13  
ok
    

相关推荐

    ToyBricks平台开发的部分产品界面截图

    在ToyBricks平台中,开发者可能会遇到以下知识点: 1. **图形化界面设计**:ToyBricks可能提供了丰富的UI组件库,使得非专业UI设计师也能创建美观的界面。 2. **事件驱动编程**:通过拖放组件并配置事件响应,...

    Android-ToyBricks是一个Android库提供简单的方法来实现模块化

    3. **ToyBricks插件(Gradle Plugin)**:Gradle是Android开发中的主流构建工具,而插件则可以扩展其功能。ToyBricks插件是针对Gradle的定制化解决方案,它能够自动配置和管理模块间的依赖关系,以及处理模块间的...

    “像搭积木一样开发应用”--开源的ToyBricks(积木)开发平台

    压缩包中的“ToyBricks平台源代码许可协议.doc”文件详细说明了使用ToyBricks源代码的法律条款和条件。通常,开源项目会遵循某种开放源代码许可,如MIT、Apache 2.0或GPL等,这些许可定义了如何使用、修改和分发...

    ToyBricks_Vc_

    通过研究"ToyBricks"的源代码,我们可以学习如何在VC++环境中组织代码,如何用面向对象的方式思考问题,以及如何处理实时游戏中的各种挑战。这对于任何希望进入游戏开发领域的人来说都是一个很好的起点。此外,对于...

    bricks 点对点网络测试软件

    总结,bricks作为一款点对点网络测速软件,以其专业性和实用性在行业中占有一席之地。无论是网络设施的建设验收,还是日常的网络维护,bricks都能提供有力的支持,帮助用户快速准确地评估和优化网络性能。对于任何...

    Bricks 方块小游戏

    Bricks 方块小游戏Bricks 方块小游戏Bricks 方块小游戏Bricks 方块小游戏

    测试网络速度的工具bricks

    在日常的网络使用中,我们可能会遇到网络慢、延迟高等问题,这时就需要用到像Bricks这样的工具来诊断和优化网络性能。 ### 一、Bricks的主要功能 1. **速度测试**:Bricks的核心功能是测量上传和下载速度。它可以...

    Bricks

    "Bricks"是一个与字体相关的项目,从标题和描述中我们可以推测这可能是一个关于设计、图形或者排版的资源包,特别关注的是字体这一视觉元素。在IT行业中,字体不仅关乎美学,它还涉及到用户体验、可读性以及品牌识别...

    前端项目-bricks.js.zip

    3. **初始化 bricks.js**:在 JavaScript 中,创建一个新的 bricks 实例,指定容器元素和配置项,例如: ```javascript var container = document.getElementById('masonry-container'); var options = { ...

    cra-starter-reactbricks:基本的Starter React Bricks与Create React App

    React Bricks入门香草React 该入门程序面向需要将其集成到现有React项目中的用户,而不是从Next.js入门...该应用程序通过create-react-app,TypeScript和仅添加的两个依赖项进行引导: @reach/router react-bricks

    packet-bricks, 一种基于netmap的数据包分发与过滤.zip

    packet-bricks, 一种基于netmap的数据包分发与过滤 自述文件Packet是一个 linux/freebsd守护进程,它能够接收和分配到用户应用程序的输入流量。 它的主要职责可能包括( i ) 负载平衡。( 二) 复制和/或者( iii ) 过滤...

    toy-bricks:一个 3D 游戏框架-开源

    "toy-bricks"是一个专为开发3D游戏而设计的开源框架,它的核心特性在于采用C++编程语言,为游戏开发者提供了一套高效且灵活的工具集。该框架的命名"Bricks"寓意其如同构建游戏世界的积木,旨在帮助开发者轻松搭建起...

    Scratch Bricks 入门指南 [兼容模式].pdf,青少年编程

    Scratch Bricks 入门指南 [兼容模式].pdf

    Bricks:网页中的简单积木游戏

    《Bricks:构建网页乐趣的JavaScript游戏》 Bricks是一款基于JavaScript开发的简单网页游戏,其设计理念在于提供一种轻松愉快的用户体验,通过浏览器本地运行,无需下载安装即可享受游戏的乐趣。游戏的核心玩法是...

    html-bricks-template:html-bricks网站的简单模板

    3. **npm (Node Package Manager)**:`npm`是JavaScript开发中的包管理工具,用于安装、管理和共享依赖项。在描述中提到的`npm install`命令用于安装项目所依赖的包,而`npm start`则通常用于启动开发服务器或编译...

    bricks打字游戏

    打字游戏,练习用的swf,很适合初学打字的同学,试试吧。

    lego-parts-shopping-helper:改进 Bricklink & LEGO Bricks & Pieces 的 Chrome 扩展程序,帮助您更高效地购买 LEGO:registered: 零件

    在LEGO Bricks & Pieces 中导入零件清单(来自或 ) 添加缓存(使用 LocalStorage 或其他任何东西,只要这可以提高性能并防止对任何外部服务的滥用调用) 利用 Web Worker 更快地调用列表 使用 React 模板

    bricks

    4. **易于扩展**:如果你需要实现新的计算模块,只需编写一个新的砖块类并将其与其他砖块连接即可。 5. **集成优化**:框架内建了常见的优化算法,如随机梯度下降(SGD)、Adam等,可以方便地应用到模型训练中。 6...

Global site tag (gtag.js) - Google Analytics