Skip to Content
DocsClaDICore ConceptsDecorator Modules

Decorator Modules

ClaDI supports decorator-based module composition without reflection metadata.

Core Decorators

  • @Injectable({ token, lifecycle, deps? })
  • @Inject(token) constructor parameter decorator
  • @Module({ imports, providers, exports, name })
  • @OnInit(), @AfterResolve(), @OnDispose()

autowire()

autowire() creates a class provider from @Injectable metadata:

src/autowire.ts
import { Injectable, autowire, createDIContainer, createToken, EDependencyLifecycle } from "@elsikora/cladi"; const ServiceToken = createToken<{ run(): string }>("Service"); @Injectable({ lifecycle: EDependencyLifecycle.SINGLETON, token: ServiceToken }) class Service { public run(): string { return "ok"; } } const container = createDIContainer(); container.register(autowire(Service));

Module Composition Options

Option A: compose decorated modules directly

Use composeDecoratedModules() for the cleanest composition-root API:

src/compose-decorated.ts
import { Module, composeDecoratedModules, createDIContainer } from "@elsikora/cladi"; @Module({ providers: [], exports: [], imports: [], name: "app" }) class AppModule {} const container = createDIContainer(); composeDecoratedModules(container, [AppModule]);

Option B: convert explicitly, then compose

Use createModuleFromDecorator() when you need plain IDIModule objects:

src/compose-explicit.ts
import { composeModules, createDIContainer, createModuleFromDecorator } from "@elsikora/cladi"; const moduleDefinition = createModuleFromDecorator(AppModule); const container = createDIContainer(); composeModules(container, [moduleDefinition]);

Metadata Introspection

Decorator metadata can be read for tests and diagnostics:

src/metadata.ts
import { getInjectableMetadata, getModuleMetadata } from "@elsikora/cladi"; const injectableMetadata = getInjectableMetadata(Service); const moduleMetadata = getModuleMetadata(AppModule);
Last updated on