85 lines
No EOL
2.5 KiB
Markdown
85 lines
No EOL
2.5 KiB
Markdown
# Awilix DI Container Migration Guide
|
|
|
|
This guide explains how to use the new Awilix dependency injection container in the data-ingestion service.
|
|
|
|
## Overview
|
|
|
|
The Awilix container provides proper dependency injection for decoupled libraries, allowing them to be reused in other projects without stock-bot specific dependencies.
|
|
|
|
## Current Implementation
|
|
|
|
The data-ingestion service now uses a hybrid approach:
|
|
1. Awilix container for ProxyManager and other decoupled services
|
|
2. Legacy service factory for backward compatibility
|
|
|
|
## Usage Example
|
|
|
|
```typescript
|
|
// Create Awilix container
|
|
const awilixConfig = {
|
|
redis: {
|
|
host: config.database.dragonfly.host,
|
|
port: config.database.dragonfly.port,
|
|
db: config.database.dragonfly.db,
|
|
},
|
|
mongodb: {
|
|
uri: config.database.mongodb.uri,
|
|
database: config.database.mongodb.database,
|
|
},
|
|
postgres: {
|
|
host: config.database.postgres.host,
|
|
port: config.database.postgres.port,
|
|
database: config.database.postgres.database,
|
|
user: config.database.postgres.user,
|
|
password: config.database.postgres.password,
|
|
},
|
|
proxy: {
|
|
cachePrefix: 'proxy:',
|
|
ttl: 3600,
|
|
},
|
|
};
|
|
|
|
const container = createServiceContainer(awilixConfig);
|
|
await initializeServices(container);
|
|
|
|
// Access services from container
|
|
const proxyManager = container.resolve('proxyManager');
|
|
const cache = container.resolve('cache');
|
|
```
|
|
|
|
## Handler Integration
|
|
|
|
Handlers receive services through the enhanced service container:
|
|
|
|
```typescript
|
|
// Create service adapter with proxy from Awilix
|
|
const serviceContainerWithProxy = createServiceAdapter(services);
|
|
Object.defineProperty(serviceContainerWithProxy, 'proxy', {
|
|
get: () => container.resolve('proxyManager'),
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
|
|
// Handlers can now access proxy service
|
|
class MyHandler extends BaseHandler {
|
|
async myOperation() {
|
|
const proxy = this.proxy.getRandomProxy();
|
|
// Use proxy...
|
|
}
|
|
}
|
|
```
|
|
|
|
## Benefits
|
|
|
|
1. **Decoupled Libraries**: Libraries no longer depend on @stock-bot/config
|
|
2. **Reusability**: Libraries can be used in other projects
|
|
3. **Testability**: Easy to mock dependencies for testing
|
|
4. **Type Safety**: Full TypeScript support with Awilix
|
|
|
|
## Next Steps
|
|
|
|
To fully migrate to Awilix:
|
|
1. Update HTTP library to accept dependencies via constructor
|
|
2. Update Queue library to accept Redis config via constructor
|
|
3. Create actual MongoDB, PostgreSQL, and QuestDB clients in the container
|
|
4. Remove legacy service factory once all services are migrated |