组件实例可以包含子元素。 因此,我们通常将大区看作一个组件实例及其一组子级。
领域在组件框架中发挥着特殊作用。领域是组件实例的封装边界。这意味着:
领域还能充当所有权边界,也就是说,子组件实例是父领域拥有的子领域(控制其存在)的根。如需了解详情,请参阅子组件实例。
示例
下面是一个通过其路由的 capability 的示例:
在此示例中,shell
组件有两个子级:tools
和 services
。services
有两个子项:logger
和 echo
,而 tools
有一个子项 echo_tool
。组件会封装其子项,因此,虽然 shell
组件会看到自己的子项,但它并不能直接了解其子项 echo_tool
、logger
或 echo
。不过,所有这些组件实例都被视为 shell
领域的一部分。
这些箭头说明了 fuchsia.Echo
服务 capability 的路径,后者通过 Realm 从 echo
路由到 echo_tool
。向上箭头对应于 expose
声明,而向下箭头表示 offer
声明。expose
声明会导致 fuchsia.Echo
在相应领域的功能边界之外公开。例如,如果 services
未提供 fuchsia.Echo
,shell
将无法知晓 fuchsia.Echo
的存在,并且无法为其子项提供服务,也无法在运行时访问该服务。
如需查看此示例的功能路由的更详细演示,请参阅组件清单功能路由示例。
子组件实例
组件实例可以包含子元素。子组件实例被视为父实例定义的一部分,由父组件完全拥有。这会带来以下影响:
- 组件实例决定它包含哪些子项,以及何时创建和销毁其子项。
- 组件实例没有父组件就无法存在。
- 除非其父级正在执行,否则组件实例可能无法执行。
- 组件实例通过向子项发出
offer
声明来确定其子项可用的功能。 - 组件实例可以一定程度上控制其子项的行为。例如,组件实例可以绑定到通过
Realm
框架服务从子级的领域提供的功能,也可以设置钩子来拦截子级生命周期事件。不过,此控制不是绝对的。例如,组件实例无法使用未明确提供给它的子领域中的功能。
静态子项
静态子项是通过 children
声明在组件清单中静态声明的组件实例。此声明是确定子组件实例是否存在的必要且充分的声明。
通常,子项应以静态方式声明,除非其需要是动态子项(请参阅动态子项)。静态声明子项时,可以审核其定义和功能,并且可以通过静态路由权能。
静态子项主要由以下两项信息定义:
- 子实例的名称。该名称是父组件实例的本地名称,用于构成名称。声明多个具有相同网址但名称不同的子项是有效的。
- 子实例的组件网址。
如需了解如何为子声明提供额外的配置信息,请参阅子声明。
动态子级
动态子级是在运行时在组件集合中创建的组件实例。动态子项的作用域始终限定为特定集合。动态子级可用于支持无法提前确定组件实例是否存在或基数的用例。例如,测试领域可以声明一个集合,您可以在其中创建测试组件实例。
用于创建动态子项的大多数元数据与声明静态实例的元数据相同,只不过它在运行时提供。动态子项的名称隐式限定为其集合;因此,可以在两个同名的不同集合中有两个动态子项。
功能无法从动态实例进行静态路由。这是固有的限制:无法通过动态实例公开的功能静态声明路由。不过,某些功能可从整个集合中路由。TODO:服务目录示例
组件集合
集合是可以在运行时使用 Realm 框架服务创建和销毁动态子项的容器。
集合支持两种持久性模式:
- 暂时性:当包含该集合的实例停止时,系统会自动销毁瞬态集合中的实例。
- 单次运行:单次运行集合中的实例在创建时启动,并在停止时销毁。这意味着,单个运行集合中的实例只能运行一次。
如需详细了解组件的执行和持久化,请参阅lifecycle。
集合在组件清单的 collections
部分中声明。当 offer
声明针对某个集合时,提供的功能可用于该集合中的每个实例。某些功能可以在集合中作为一个整体公开或提供,从而对集合中的实例公开的相应功能进行汇总。
TODO:服务目录示例
示例
下图展示了包含集合的大区:
在此示例中,shell
组件声明了一个静态子级 console
和一个集合 (tools)
,并用灰色背景突出显示(()
表示法表示一个集合)。(tools)
包含两个动态实例:ls
和 grep
。这些实例是 shell
的动态子项,作用域限定为 (tools)
。使用集合意味着事先不知道 ls
和 grep
的存在。假设您将 ls
和 grep
是按需实例化的命令行工具,这是合理的。
该示例还展示了带有箭头的功能路由路径。首先,console
向其父级 shell
公开 fuchsia.Console
,后者再将其提供给 (tools)
。然后,fuchsia.Console
将可供集合中的任何组件实例使用,而无需单独路由到动态实例。
环境
每个领域都分配有一个环境,用于配置框架为领域中的组件做出的某些选择。例如,运行程序功能注册到环境中,这使得它们可供领域中的任何组件实例使用。如需了解可通过环境配置哪些属性,请参阅环境。
Realm 框架协议
每个组件都有可用的框架协议,即 fuchsia.component.Realm
。Realm
协议为组件实例提供 API,用于管理其领域中的子项,例如绑定到子项和创建动态子项。如需查看完整文档,请参阅链接的 FIDL 定义。