di usage in website
This commit is contained in:
90
apps/website/lib/di/container.ts
Normal file
90
apps/website/lib/di/container.ts
Normal file
@@ -0,0 +1,90 @@
|
||||
import { Container } from 'inversify';
|
||||
|
||||
// Module imports
|
||||
import { ApiModule } from './modules/api.module';
|
||||
import { CoreModule } from './modules/core.module';
|
||||
import { DashboardModule } from './modules/dashboard.module';
|
||||
import { DriverModule } from './modules/driver.module';
|
||||
import { LeagueModule } from './modules/league.module';
|
||||
import { TeamModule } from './modules/team.module';
|
||||
import { RaceModule } from './modules/race.module';
|
||||
import { AnalyticsModule } from './modules/analytics.module';
|
||||
import { LandingModule } from './modules/landing.module';
|
||||
import { PolicyModule } from './modules/policy.module';
|
||||
import { SponsorModule } from './modules/sponsor.module';
|
||||
|
||||
/**
|
||||
* Creates and configures the root DI container
|
||||
*/
|
||||
export function createContainer(): Container {
|
||||
const container = new Container();
|
||||
|
||||
// Load all modules
|
||||
container.load(
|
||||
CoreModule,
|
||||
ApiModule,
|
||||
LeagueModule,
|
||||
DriverModule,
|
||||
TeamModule,
|
||||
DashboardModule,
|
||||
AnalyticsModule,
|
||||
RaceModule,
|
||||
LandingModule,
|
||||
PolicyModule,
|
||||
SponsorModule
|
||||
);
|
||||
|
||||
return container;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a container for testing with mock overrides
|
||||
*/
|
||||
export function createTestContainer(overrides: Map<symbol, any> = new Map()): Container {
|
||||
const container = createContainer();
|
||||
|
||||
// Apply mock overrides using rebind
|
||||
const promises = Array.from(overrides.entries()).map(([token, mockInstance]) => {
|
||||
return container.rebind(token).then(bind => bind.toConstantValue(mockInstance));
|
||||
});
|
||||
|
||||
// Return container immediately, mocks will be available after promises resolve
|
||||
// For synchronous testing, users can bind directly before loading modules
|
||||
return container;
|
||||
}
|
||||
|
||||
/**
|
||||
* Container lifecycle management
|
||||
*/
|
||||
export class ContainerManager {
|
||||
private static instance: ContainerManager | null = null;
|
||||
private container: Container | null = null;
|
||||
|
||||
private constructor() {}
|
||||
|
||||
static getInstance(): ContainerManager {
|
||||
if (!ContainerManager.instance) {
|
||||
ContainerManager.instance = new ContainerManager();
|
||||
}
|
||||
return ContainerManager.instance;
|
||||
}
|
||||
|
||||
getContainer(): Container {
|
||||
if (!this.container) {
|
||||
this.container = createContainer();
|
||||
}
|
||||
return this.container;
|
||||
}
|
||||
|
||||
createScopedContainer(): Container {
|
||||
// In this version, we create a new container
|
||||
return new Container();
|
||||
}
|
||||
|
||||
dispose(): void {
|
||||
if (this.container) {
|
||||
this.container.unbindAll();
|
||||
this.container = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user