Skip to content

Examples

This section shows practical patterns built with current @lumelabs/react-di API.

Root Module + Resolve

tsx
import "reflect-metadata"
import { Injectable, ModuleProvider, useResolve } from "@lumelabs/react-di"

@Injectable()
class UserService {
    getName() {
        return "Lumelabs"
    }
}

function View() {
    const users = useResolve(UserService)
    return <div>{users.getName()}</div>
}

export function App() {
    return (
        <ModuleProvider root providers={[UserService]}>
            <View />
        </ModuleProvider>
    )
}

Local Override in Child Module

tsx
const API_URL = Symbol("API_URL")

<ModuleProvider root providers={[{ provide: API_URL, useValue: "https://api.prod" }]}>
    <ModuleProvider providers={[{ provide: API_URL, useValue: "https://api.preview" }]}>
        <PreviewPanel />
    </ModuleProvider>
</ModuleProvider>

Module Lifecycle Provider

ts
import { Injectable, type ModuleLifecycle } from "@lumelabs/react-di"

@Injectable()
class SocketService implements ModuleLifecycle {
    onModuleInit() {
        // create socket
    }

    onModuleDestroy() {
        // final cleanup
    }
}

Async Teardown with Priority

tsx
import { AsyncTeardown, ModuleProvider, useAsyncTeardown } from "@lumelabs/react-di"

function Feature() {
    useAsyncTeardown(async () => {
        await analytics.flush()
    }, 10)

    useAsyncTeardown(() => {
        socket.disconnect()
    }, 1)

    return null
}

<ModuleProvider root providers={[AsyncTeardown]}>
    <Feature />
</ModuleProvider>

Custom Tokenizer Namespace

ts
import { makeTokenizer } from "@lumelabs/react-di"

const AppToken = makeTokenizer("@app")
export const API_URL = AppToken<string>("API_URL")