Component topology

The component topology is a general concept that expresses the set of relationships between component instances.

These relationships are the following:

  • Component instance tree: Describes how component instances are composed together (their parent-child relationships).
  • Capability routing graph: Describes how component instances gain access to use capabilities published by other component instances (their provider-consumer relationships).

Component instances

A component instance is a distinct embodiment of a component running in its own sandbox that is isolated from other component instances (including other instances of the same component).

You can often use the terms component and component instance interchangeably when the context is clear. For example, it would be more precise to talk about "starting a component instance" rather than "starting a component" but you can easily infer that "starting a component" requires an instance of that component to be created first so that the instance can be started.

While components are identified by a URL, component instances are identified by a moniker. Different instances of the same component thus share the same URL but have different monikers.

Component instance tree

The component instance tree expresses how components are assembled together to make more complex components.

Using hierarchical composition, a parent component creates instances of other components, which are known as its children. The child instances belong to the parent and depend on the parent to provide them with the capabilities that they need to run. Meanwhile, the parent gains access to the capabilities exposed by its children through capability routing.

Children can be created in two ways:

  • Statically: The parent declares the existence of the child in its own component declaration. The child is destroyed automatically if the child declaration is removed in an updated version of the parent's software.
  • Dynamically: The parent uses the Realm framework protocol to add a child to a component collection that the parent declared. The parent destroys the child in a similar manner.

The component topology represents the structure of these parent-child relationships as a component instance tree .


Diagram of component instance tree

Monikers

A moniker identifies a specific component instance in the component tree using a topological path. There are three types of monikers, depending on how the moniker is being used and kind of relationship it's describing: absolute, relative, and child.

See the monikers documentation for more information.


Diagram of component instance tree with monikers

Realms

A realm is a subtree of the component instance tree. Each realm is rooted by a component instance and includes all of that instance's children and their descendants. Put another way, realms express hierarchical composition of component instances.

Realms are important encapsulation boundaries in the component topology. The root of each realm receives certain privileges to influence the behavior of components, such as:

  • Declaring how capabilities flow into, out of, and within the realm.
  • Binding to child components to access their capabilities.
  • Creating and destroying child components.

See the realms documentation for more information.


Diagram of component realms

Encapsulation

A component acts as an encapsulation boundary. Capabilities cannot escape a component's realm unless explicitly allowed to by an expose declaration.

Children remain forever dependent upon their parent; they cannot be reparented and they cannot outlive their parent. When a parent is destroyed so are all of its children.

This model resembles composition in object-oriented programming languages.

See the realms documentation for more information.


Diagram of component instance encapsulation

Capability routing graph

The capability routing graph describes how components gain access to use capabilities exposed and offered by other components in the component instance tree. For a capability provided by a component instance to be usable by a consumer component instance, there must be capability routing path between them. Such capability routes are determined by use, offer, and expose declarations in component declarations.

See the capability routing documentation for more information.


Diagram of capability routing