Skip to content
nooh
Esc
↑↓navigate↵open⌘Jpreview
On this page

Providers

The four provider functions in Nooh — singleton, request, transient, and value.

Nooh provides four provider functions to declare how instances are created and managed:

singleton

Instantiated once and shared across the entire application lifecycle.

request

Instantiated once per HTTP request and cached for that request’s duration.

transient

Instantiated anew every single time it is resolved or requested.

value

Wraps a static constant, configuration object, or pre-constructed value.

singleton

Use singleton for stateless services, connection pools, clients, or caches that should live for the lifetime of your server.

Basic Factory

When the singleton doesn’t need other dependencies:

import { singleton } from "@nooh-ts/nooh";
import { PrismaClient } from "@prisma/client";

export const prisma = singleton(() => new PrismaClient());

With Dependencies

When the singleton needs other dependencies, pass an options object with deps and a factory function:

import { singleton } from "@nooh-ts/nooh";

export const authService = singleton({
  deps: [db, jwtConfig],
  factory: ({ db, jwtConfig }) => new AuthService(db, jwtConfig),
});

request

Use request for services that need per-request state, such as authentication context, tenant information, or localized audit loggers.

import { request } from "@nooh-ts/nooh";

export const tenantContext = request(() => new TenantContext());

export const tenantRepo = request({
  deps: [db, tenantContext],
  factory: ({ db, tenantContext }) => new TenantRepository(db, tenantContext),
});

If multiple services within the same HTTP request depend on tenantContext, they all receive the exact same instance. Once the request finishes, the instance is garbage-collected.

transient

Use transient for lightweight, stateful helpers or commands where every consumer must receive an isolated, fresh instance.

import { transient } from "@nooh-ts/nooh";

export const queryBuilder = transient(() => new QueryBuilder());

export const reportGenerator = transient({
  deps: [queryBuilder],
  factory: ({ queryBuilder }) => new ReportGenerator(queryBuilder),
});

value

Use value to register plain static data, configuration objects, or third-party instances initialized outside the container:

import { value } from "@nooh-ts/nooh";

export const appConfig = value({
  env: process.env.NODE_ENV ?? "development",
  port: Number(process.env.PORT ?? 3000),
  corsOrigin: "*",
});

Quick Reference Summary

Provider Lifetime Instantiation Sharing
singleton Entire app process On first resolution Shared globally
request Single HTTP request On first resolution in request Shared within request
transient Call-site On every resolution Never shared
value Static Immediate Shared globally

Was this page helpful?