元件執行個體可以包含子項。 因此,一般來說,將領域視為元件執行個體及其子項組合很常見。
運作範圍在元件架構中扮演特殊角色,領域是元件執行個體的封裝邊界。因此:
-
方法是透過元件資訊清單中的
expose
宣告來完成。 - 子運作範圍的內部結構與父項元件執行個體不透明。舉例來說,子領域可以是一或多個元件執行個體,從父項元件執行個體的角度來看,只要子領域「公開」同一組功能即可。
同時範圍也會做為「擁有權邊界」,也就是說,子元件執行個體是擁有者擁有的子領域根,且該範圍會控管其是否存在。詳情請參閱「子元件執行個體」一節。
範例
以下是具有功能轉送功能的領域範例:
在這個範例中,shell
元件有兩個子項:tools
和 services
。services
有兩個子項,logger
和 echo
;而 tools
有一個子項 echo_tool
。元件會封裝子項,因此 shell
元件可以看到自己的子項,但不具備其子子項的 echo_tool
、logger
或 echo
的直接瞭解。儘管如此,所有這些元件執行個體都會視為 shell
領域的一部分。
箭頭說明 fuchsia.Echo
服務能力的路徑,該領域從 echo
到 echo_tool
。向上箭頭對應於 expose
宣告,向下箭頭則代表 offer
宣告。expose
宣告會導致 fuchsia.Echo
在相應領域的能力邊界外公開。例如,如果 services
未公開 fuchsia.Echo
,shell
就無法得知 fuchsia.Echo
存在,也無法向子項提供服務或在執行階段存取服務。
如需此範例的能力轉送詳細說明,請參閱元件資訊清單能力轉送範例。
子元件執行個體
元件執行個體可能包含子項。子項元件執行個體會視為父項執行個體定義的一部分,並完全由父項擁有。這會產生下列影響:
- 元件執行個體可以決定其包含的子項,以及其子項的建立及刪除時間。
- 如果沒有父項,元件執行個體就不能存在。
- 元件執行個體除非父項正在執行,否則無法執行。
- 元件執行個體會對子項發出
offer
宣告,決定子項可使用的功能。 - 元件執行個體可以控管其子項的行為。舉例來說,元件執行個體可能會透過
Realm
架構服務繫結至從子項運作領域公開的功能,或是設定掛鉤以攔截子項生命週期事件。不過,這個控制項並不是絕對的。例如,元件執行個體無法使用未明確公開的子領域能力。
靜態子項
「靜態子項」是一種元件執行個體,透過 children
宣告,在元件的資訊清單中以靜態方式宣告。這個宣告是必要程序,且足以建立子項元件執行個體存在。
一般而言,除非子項有動態的理由,否則應以靜態方式宣告子項 (請參閱動態子項)。以靜態方式宣告子項時,可以稽核其定義和功能,並以靜態方式轉送子項的功能。
靜態的子項通常是由兩種資訊定義:
- 子執行個體的名稱。該名稱是父項元件執行個體的本機名稱,用於形成「monikers」。宣告多個具有相同網址和名稱的子項是有效的。
- 子項執行個體的元件網址。
如要瞭解如何為子項宣告提供其他設定資訊,請參閱子項。
孩童動態
「動態子項」是在執行階段期間建立的元件集合中建立的元件執行個體。動態子項一律會限定為特定集合。動態子項可用於支援元件執行個體存在或基數的用途。舉例來說,測試領域可能會宣告可在當中建立測試元件執行個體的集合。
建立動態子項的中繼資料大多與宣告靜態執行個體的中繼資料相同,只是在執行階段提供。動態子項的名稱會在其集合中隱含地限定在集合中;因此,您可以在兩個不同集合中具有相同名稱的兩個動態子項。
無法從動態執行個體中靜態轉送功能。這是固有的限制,因為無法從動態執行個體公開的能力以靜態方式宣告路徑。不過,某些功能可從整個集合轉送。待辦事項:服務目錄做為範例
元件集合
「集合」是動態子項的容器,可在執行階段使用 Realm 架構服務建立及刪除。
集合支援兩種耐用性模式:
- 暫時性:當包含集合的執行個體停止時,「暫時性」集合中的執行個體會自動刪除。
- 單一執行:單次執行集合中的執行個體會在建立時啟動,並在停止時刪除。這表示單一執行集合中的執行個體只能執行一次。
如要進一步瞭解元件的執行與持續性,請參閱「lifecycle」。
集合會在元件資訊清單的 collections
區段中宣告。當 offer
宣告指定集合時,該功能提供給集合中的每個執行個體都可以使用所提供的功能。部分功能可以在整個集合公開或提供,做為匯總集合中執行個體所公開的對應功能。
待辦事項:服務目錄做為範例
範例
下圖說明包含集合的領域:
在這個範例中,shell
元件宣告靜態子項 console
和以灰色背景醒目顯示的集合 (tools)
(()
標記代表集合)。(tools)
包含兩個動態執行個體:ls
和 grep
。這些執行個體是 shell
的動態子項,範圍限定為 (tools)
。使用集合表示,無法事先得知 ls
和 grep
是否存在。想像一下,如果 ls
和 grep
是指令列工具,會在使用者要求時依需求例項化。
範例中也以箭頭說明能力轉送路徑。首先,console
會向其父項 shell
公開 fuchsia.Console
,後者會提供給 (tools)
。接著,fuchsia.Console
可用於集合中的任何元件執行個體,以供「使用」使用,而不需要獨立轉送至動態執行個體。
環境
每個運作範圍都會獲派一個「環境」,其中包含了架構中元件對元件所做的特定選擇。舉例來說,執行器功能會註冊至環境,因此領域中的任何元件執行個體皆可使用。如要瞭解可透過環境設定的屬性,請參閱環境相關說明。
運作範圍架構通訊協定
每個元件 fuchsia.component.Realm
都有可用的架構通訊協定。Realm
通訊協定為元件執行個體提供 API,用於管理其領域中的子項,例如:繫結至子項和建立動態子項。如需完整說明文件,請參閱連結的 FIDL 定義。