Files
goplt/docs/adr/0003-dependency-injection-framework.md
0x1d 6a17236474 docs: add implementation plan, ADRs, and task tracking system
- Add comprehensive 8-phase implementation plan (docs/plan.md)
- Add 28 Architecture Decision Records (docs/adr/) covering all phases
- Add task tracking system with 283+ task files (docs/stories/)
- Add task generator script for automated task file creation
- Add reference playbooks and requirements documentation

This commit establishes the complete planning foundation for the Go
Platform implementation, documenting all architectural decisions and
providing detailed task breakdown for Phases 0-8.
2025-11-04 22:05:37 +01:00

1.6 KiB

ADR-0003: Dependency Injection Framework

Status

Accepted

Context

The platform requires dependency injection to:

  • Manage service lifecycle
  • Wire dependencies between components
  • Support module system initialization
  • Handle graceful shutdown
  • Provide testability through dependency substitution

Options considered:

  1. uber-go/fx - Runtime dependency injection with lifecycle management
  2. uber-go/dig - Compile-time dependency injection
  3. Manual constructor injection - No framework, explicit wiring

Decision

Use uber-go/fx (v1.23.0+) as the dependency injection framework.

Rationale:

  • Provides lifecycle management (OnStart/OnStop hooks) crucial for services
  • Supports module-based architecture through fx.Option composition
  • Runtime dependency resolution with compile-time type safety
  • Excellent for modular monolith architecture
  • Well-documented and actively maintained
  • Used by major Go projects (Uber, etc.)

Consequences

Positive

  • Clean lifecycle management for services
  • Easy module composition via fx.Option
  • Graceful shutdown handling built-in
  • Test-friendly with fx.Options for test overrides

Negative

  • Runtime reflection overhead (minimal)
  • Learning curve for developers unfamiliar with fx
  • Slightly more complex error messages on dependency resolution failures

Implementation Notes

  • Install: go get go.uber.org/fx@v1.23.0
  • Create internal/di/container.go with fx.New()
  • Use fx.Provide() for service registration
  • Use fx.Invoke() for initialization tasks
  • Leverage fx.Lifecycle for service startup/shutdown