# Dependency Injection

> A design pattern that passes an object its dependencies from outside, usually through its constructor.

Record: `architecture:dependency-injection`
Kind: pattern
Layer: [Extensibility Core](https://banes-lab.com/records/layer/extensibility-core.md)
Severity: recommended
Scope: class, module, component
Canonical: https://banes-lab.com/ontology#architecture-dependency-injection

Listed in [Architecture principles](https://banes-lab.com/api/records/architecture.md), after [Inversion of Control (IoC)](https://banes-lab.com/records/architecture/inversion-of-control.md) and before [Service Registry](https://banes-lab.com/records/architecture/service-registry.md).

## Repair

- Refactored by: Inject Constructor Parameter, Add Factory
- Detected by: direct construction of external dependencies
- Violated by: newing dependencies inside business logic
- Measured by: injected dependency ratio
- Enforced by: lint rules, dependency review

## Requires

- [Abstraction](https://banes-lab.com/records/architecture/abstraction.md)
- [Composition Root](https://banes-lab.com/records/lexicon/composition-root.md)

## Reinforces

- [Dependency Inversion Principle (DIP)](https://banes-lab.com/records/architecture/dependency-inversion.md)
- [Testability](https://banes-lab.com/records/architecture/testability.md)

## Enables

- [Mocking](https://banes-lab.com/records/lexicon/mocking.md)
- [Replaceability](https://banes-lab.com/records/architecture/replaceability.md)

## Conflicts with

- [Hardcoded Instantiation](https://banes-lab.com/records/lexicon/hardcoded-instantiation.md)
- [Ambient Context](https://banes-lab.com/records/architecture/ambient-context.md)

## In tension with

- [Constructor Complexity](https://banes-lab.com/records/lexicon/constructor-complexity.md)
- [Singleton Pattern](https://banes-lab.com/records/architecture/singleton-pattern.md)
- [Singleton Pattern / Dependency Injection](https://banes-lab.com/records/tension/dependency-injection-singleton-pattern.md)

## Tensions

- [Dependency Injection / Constructor Complexity](https://banes-lab.com/records/tension/constructor-complexity-dependency-injection.md)

## Severity

- [recommended](https://banes-lab.com/records/vocabulary/severity-recommended.md)

## Category

- [Plugin / Extensibility / IoC](https://banes-lab.com/records/architecture-category/plugin-extensibility-ioc.md)

## Enabled by

- [Interface-Based Design](https://banes-lab.com/records/architecture/interface-based-design.md)

## Reinforced by

- [Inversion of Control](https://banes-lab.com/records/architecture/inversion-of-control.md)

## Linked from

- [The direction axis](https://banes-lab.com/software-architecture/model/the-direction-axis.md)
- [Anti-patterns](https://banes-lab.com/ontology/principles/architecture-category-anti-patterns.md)
- [Contracts / Interfaces / Compatibility](https://banes-lab.com/ontology/principles/architecture-category-contracts-interfaces-compatibility.md)
- [Correctness / Determinism / Verification](https://banes-lab.com/ontology/principles/architecture-category-correctness-determinism-verification.md)
- [Core Modular Design](https://banes-lab.com/ontology/principles/architecture-category-core-modular-design.md)
- [SOLID / Object-Oriented Design](https://banes-lab.com/ontology/principles/architecture-category-solid-object-oriented-design.md)
- [Creational Patterns](https://banes-lab.com/ontology/principles/architecture-category-creational-patterns.md)
- [Plugin / Extensibility / IoC](https://banes-lab.com/ontology/principles/architecture-category-plugin-extensibility-ioc.md)
- [Core Vocabulary](https://banes-lab.com/ontology/lexicon/lexicon-category-core-vocabulary.md)
- [Plugin / Extensibility / IoC](https://banes-lab.com/ontology/lexicon/lexicon-category-plugin-extensibility-ioc.md)
- [Severity levels](https://banes-lab.com/ontology/schema/the-vocabulary-severity.md)
- [The resolutions](https://banes-lab.com/ontology/schema/the-resolutions.md)
