# Registry Pattern

> A design pattern that replaces a conditional over kinds with a keyed table that each kind registers itself into.

Record: `architecture:registry-pattern`
Kind: pattern
Layer: [Extensibility Core](https://banes-lab.com/records/layer/extensibility-core.md)
Severity: contextual
Scope: runtime, module, plugin
Canonical: https://banes-lab.com/ontology#architecture-registry-pattern

Listed in [Architecture principles](https://banes-lab.com/api/records/architecture.md), after [Service Registry](https://banes-lab.com/records/architecture/service-registry.md) and before [Service Locator Pattern](https://banes-lab.com/records/architecture/service-locator-pattern.md).

## Repair

- Refactored by: Encapsulate Registry, Add Typed Keys
- Detected by: mutable global maps without lifecycle
- Violated by: ungoverned global registry
- Measured by: registry consistency
- Enforced by: registry validation

## Requires

- [Keyed Registration](https://banes-lab.com/records/lexicon/keyed-registration.md)

## Reinforces

- [Discovery](https://banes-lab.com/records/lexicon/discovery.md)
- [Factory Pattern](https://banes-lab.com/records/architecture/factory-pattern.md)

## Enables

- [Dynamic Lookup](https://banes-lab.com/records/lexicon/dynamic-lookup.md)

## Conflicts with

- [Direct Reference](https://banes-lab.com/records/lexicon/direct-reference.md)

## In tension with

- [Global State](https://banes-lab.com/records/lexicon/global-state.md)

## Tensions

- [Registry Pattern / Global State](https://banes-lab.com/records/tension/global-state-registry-pattern.md)

## Severity

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

## Category

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

## Enforced by

- [rules/eslint/closure-register-needs-consumer.eslint.rule.ts](https://banes-lab.com/source/governance/rules/eslint/closure-register-needs-consumer.eslint.rule.ts.md)
- [rules/eslint/closure-registry-consumer-naming.eslint.rule.ts](https://banes-lab.com/source/governance/rules/eslint/closure-registry-consumer-naming.eslint.rule.ts.md)
- [rules/eslint/require-pool-registration.eslint.rule.ts](https://banes-lab.com/source/governance/rules/eslint/require-pool-registration.eslint.rule.ts.md)
- [rules/eslint/require-self-registration.eslint.rule.ts](https://banes-lab.com/source/governance/rules/eslint/require-self-registration.eslint.rule.ts.md)

## Linked from

- [When rules collide](https://banes-lab.com/disciplined-methodology/plan/when-rules-collide.md)
- [A check matches a shape](https://banes-lab.com/disciplined-methodology/build/a-check-matches-a-shape.md)
- [The filesystem is the architecture](https://banes-lab.com/disciplined-methodology/build/the-filesystem-is-the-architecture.md)
- [Definitions own what, code owns how](https://banes-lab.com/software-architecture/model/definitions-own-what.md)
- [The honest gaps](https://banes-lab.com/software-architecture/coverage/the-honest-gaps.md)
- [Creational Patterns](https://banes-lab.com/ontology/principles/architecture-category-creational-patterns.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)

## Evidence in the code

- [registerPage](https://banes-lab.com/source/tree/domain/registries/page.registry.ts.md)
- [presentation/records](https://banes-lab.com/anatomy/tree/folder-presentation-records.md)
- [presentation/records/records.barrel.ts](https://banes-lab.com/source/tree/presentation/records/records.barrel.ts.md)
- [createRegistry](https://banes-lab.com/source/tree/domain/registries/base.registry.ts.md)
