Software components may depend on each other similar to development components. If a dependency between two software components exists, then the development components of the using software component themselves may declare dependencies (of any kind) to development components of the used software component.
In a layered software system, in which an “application layer” (represented by a software component) uses the services of a “technology layer” (represented by another software component), a dependency is defined from the application layer to the technology layer. However, this does not allow the components of the technology layer to access components of the application layer.
A dependency between two software components is created without referring to actual states or versions of these components. The development configuration (or configuration) determines which actual states of these components may or must be used together.
Changes in the dependencies between software components usually require a lot of time and effort. For this reason, defining software components and creating dependencies is done by the project management rather than by developers.
A configuration establishes relations between actual states of software components. The relations between software components determine which components (DCs) are allowed to use one another and which not. Therefore, the configuration implicitly determines which actual states of components can be used together. This is an important consequence for the interaction of components: A component cannot determine by itself that it wants to interact only with a particular version of another component.
A development configuration determines that the software component ABC uses another software component Technology. A component A from ABC then declares a dependency to a DC B from Technology. The DCs of the used software components are made available. This step determines the version to be used.