Overview
Credo uses TSyringe for dependency injection, providing inversion of control throughout the framework. TheDependencyManager wraps TSyringe’s container and provides additional Credo-specific functionality.
DependencyManager
TheDependencyManager manages service registration and resolution:
Injectable Decorator
Mark classes as injectable to enable dependency injection:Inject Decorator
Inject dependencies using the@inject decorator:
Registration Scopes
Singleton
One instance shared across the entire application:- Services with no state
- Services that maintain global state
- Connection pools
- Configuration objects
Context Scoped
One instance per agent context (important for multi-tenancy):- Services that need context isolation
- Multi-tenant services
- Services with per-context state
Instance
Register a specific instance:- Configuration objects
- Pre-configured services
- External dependencies
Injection Tokens
Use injection tokens to avoid circular dependencies and enable interface-based injection:Using Injection Tokens
Creating Custom Tokens
AgentContext Injection
Many services need access to theAgentContext:
API Classes
API classes are automatically registered when specified in a module:Resolving Dependencies
Direct Resolution
Checking Registration
Multi-Injection
Inject all implementations of a token:Advanced Patterns
Factory Pattern
Conditional Registration
Interface-Based Injection
Child Containers
Create child containers for isolated scopes:Best Practices
1. Use Constructor Injection
Always prefer constructor injection over property injection:2. Use Injection Tokens for Interfaces
3. Register in Module’s register() Method
4. Use Context Scoped for Multi-Tenant Services
5. Avoid Circular Dependencies
Use injection tokens to break circular dependencies:Common Injection Symbols
Related
Custom Modules
Learn how to create modules with dependency injection
TSyringe Docs
Official TSyringe documentation