I have a module that is managing the workspaces (WorkspaceManager). A workspace is a folder that contains several files. These files are associated with various child modules. A workspace can be loaded, saved, etc. Obviously, the child modules are directly
impacted by a workspace loading operation (they have to load their own files from the folder).

In order to address this need, I was thinking of using CompositeCommand: the WorkspaceManager is exposing the load/save CompositeCommands. The child modules are registering their child DelegateCommand (load / save) with the CompositeCommands of the WorkspaceManager
in order to do the specific loading.

Another option can consist in using events (shared service events or through EventAggregator) but it seems less adapted to this situation (in particular because it's asynchronous).

Based on my understanding of your scenario, CompositeCommand
seems a reasonable approach if you expect an immediate action from the UI. This is explained in more depth in the
Communicating Between Loosely Coupled Components chapter of the Prism documentation at MSDN. From the documentation:

(...)

The Prism Library provides the following communication approaches:

Solution commanding. Use when there is an expectation of immediate action from the user interaction.

Region context. Use this to provide contextual information between the host and views in the host's region. This approach is somewhat similar to the DataContext, but it does not rely on it.

Shared services. Callers can call a method on the service which raises an event to the receiver of the message. Use this if none of the preceding is applicable.

Event aggregation. For communication across view models, presenters, or controllers when there is not a direct action-reaction expectation.

Based on my understanding of your scenario, CompositeCommand
seems a reasonable approach if you expect an immediate action from the UI. This is explained in more depth in the
Communicating Between Loosely Coupled Components chapter of the Prism documentation at MSDN. From the documentation:

(...)

The Prism Library provides the following communication approaches:

Solution commanding. Use when there is an expectation of immediate action from the user interaction.

Region context. Use this to provide contextual information between the host and views in the host's region. This approach is somewhat similar to the DataContext, but it does not rely on it.

Shared services. Callers can call a method on the service which raises an event to the receiver of the message. Use this if none of the preceding is applicable.

Event aggregation. For communication across view models, presenters, or controllers when there is not a direct action-reaction expectation.