Binding Types
toConstant(value)
Binds the token to the constant value.
Arguments
- value:- TokenType<Token>— the value that will be bound to the token.
Example
import { Container, token } from 'brandi';
const TOKENS = {
  apiKey: token<string>('API Key'),
};
const container = new Container();
container.bind(TOKENS.apiKey).toConstant('#key9428');
const key = container.get(TOKENS.apiKey);
expect(key).toBe('#key9428');
toInstance(creator)
Binds the token to an instance in one of the scopes.
Arguments
- creator:- (new (...args: any[]) => TokenType<Token>) | ((...args: any[]) => TokenType<Token>)— the instance creator that will be bound to the token.
Returns
Binding Scope syntax:
Examples
Class Instance
import { Container, token } from 'brandi';
class ApiService {
  /* ... */
}
const TOKENS = {
  apiService: token<ApiService>('apiService'),
};
const container = new Container();
container.bind(TOKENS.apiService).toInstance(ApiService).inTransientScope();
const apiService = container.get(TOKENS.apiService);
expect(apiService).toBeInstanceOf(ApiService);
Function Call Result
import { Container, token } from 'brandi';
interface ApiService {
  /* ... */
}
const createApiService = (): ApiService => {
  /* ... */
};
const TOKENS = {
  apiService: token<ApiService>('apiService'),
};
const container = new Container();
container
  .bind(TOKENS.apiService)
  .toInstance(createApiService)
  .inTransientScope();
const apiService = container.get(TOKENS.apiService);
expect(apiService).toStrictEqual<ApiService>({
  /* ... */
});
Injetions
If the constructor or function has arguments you need to register dependencies
by injected registrator.
import { injected } from 'brandi';
import { TOKENS } from './tokens';
import type { HttpClient } from './HttpClient';
export class ApiService {
  constructor(private http: HttpClient) {}
}
injected(ApiService, TOKENS.httpClient);
toFactory(creator, [initializer])
Binds the token to the factory.
Arguments
- creator— the instance creator which the factory will use;
- [initializer]— optional function called after the instance is created.
Examples
Simple Factory
import { Container, Factory, token } from 'brandi';
class ApiService {
  /* ... */
}
const TOKENS = {
  apiServiceFactory: token<Factory<ApiService>>('Factory<ApiService>'),
};
const container = new Container();
/*                                       ↓ Binds the factory. */
container.bind(TOKENS.apiServiceFactory).toFactory(ApiService);
const apiServiceFactory = container.get(TOKENS.apiServiceFactory);
const apiService = apiServiceFactory();
expect(apiService).toBeInstanceOf(ApiService);
Factory With Initializer
import { Container, Factory, token } from 'brandi';
class ApiService {
  init() {
    /* ... */
  }
  /* ... */
}
const TOKENS = {
  apiServiceFactory: token<Factory<ApiService>>('Factory<ApiService>'),
};
const container = new Container();
container
  .bind(TOKENS.apiServiceFactory)
  /*                     ↓ Binds the factory with the initializer. */
  .toFactory(ApiService, (instance) => instance.init());
const apiServiceFactory = container.get(TOKENS.apiServiceFactory);
/*                 ↓ The initializer will be called after the instance is created. */
const apiService = apiServiceFactory();
expect(apiService).toBeInstanceOf(ApiService);
Factory With Arguments
import { Container, Factory, token } from 'brandi';
class ApiService {
  public key: string;
  public setKey(key: string) {
    this.key = key;
  }
  /* ... */
}
const TOKENS = {
  /*                       ↓ `Factory` generic with second argument. */
  apiServiceFactory: token<Factory<ApiService, [apiKey: string]>>(
    'Factory<ApiService>',
  ),
};
const container = new Container();
container
  .bind(TOKENS.apiServiceFactory)
  /*                     ↓ Binds the factory with `apiKey` argument. */
  .toFactory(ApiService, (instance, apiKey) => instance.setKey(apiKey));
const apiServiceFactory = container.get(TOKENS.apiServiceFactory);
const apiService = apiServiceFactory('#key9124');
expect(apiService).toBeInstanceOf(ApiService);
expect(apiService.key).toBe('#key9124');
Functional Factory
import { Container, Factory, token } from 'brandi';
interface ApiService {
  /* ... */
}
const createApiService = (): ApiService => {
  /* ... */
};
const TOKENS = {
  apiServiceFactory: token<Factory<ApiService>>('Factory<ApiService>'),
};
const container = new Container();
container.bind(TOKENS.apiServiceFactory).toFactory(createApiService);
const apiServiceFactory = container.get(TOKENS.apiServiceFactory);
const apiService = apiServiceFactory();
expect(apiService).toStrictEqual<ApiService>({
  /* ... */
});
Instance Caching Factory
import { Container, Factory, token } from 'brandi';
class ApiService {
  /* ... */
}
const TOKENS = {
  apiService: token<ApiService>('apiService'),
  apiServiceFactory: token<Factory<ApiService>>('Factory<ApiService>'),
};
const container = new Container();
container
  .bind(TOKENS.apiService)
  .toInstance(ApiService)
  .inSingletonScope() /* ← Binds the token to `ApiService` instance in singleton scope. */;
container
  .bind(TOKENS.apiServiceFactory)
  .toFactory(() => container.get(TOKENS.apiService));
const apiServiceFactory = container.get(TOKENS.apiService);
const firstApiService = apiServiceFactory();
const secondApiService = apiServiceFactory();
expect(firstApiService).toBe(secondApiService);
Factory With Async Creator
import { AsyncFactory, Container, token } from 'brandi';
interface ApiService {
  /* ... */
}
/*                       ↓ Async creator. */
const createApiService = async (): Promise<ApiService> => {
  /* ... */
};
const TOKENS = {
  /*                 ↓ Token with `AsyncFactory` type. */
  apiServiceFactory: token<AsyncFactory<ApiService>>(
    'AsyncFactory<ApiService>',
  ),
};
const container = new Container();
container.bind(TOKENS.apiServiceFactory).toFactory(createApiService);
const apiServiceFactory = container.get(TOKENS.apiServiceFactory);
/**
 *                 ↓ Will wait for the creation resolution
 *                   and then call the initializer, if there is one.
 */
const apiService = await apiServiceFactory();
expect(apiService).toStrictEqual<ApiService>({
  /* ... */
});
Factory With Async Initializer
import { AsyncFactory, Container, token } from 'brandi';
class ApiService {
  init(): Promise<unknown> {
    /* ... */
  }
  /* ... */
}
const TOKENS = {
  /*                 ↓ Token with `AsyncFactory` type. */
  apiServiceFactory: token<AsyncFactory<ApiService>>(
    'AsyncFactory<ApiService>',
  ),
};
const container = new Container();
container
  .bind(TOKENS.apiServiceFactory)
  /*                                         ↓ Returns a `Promise`. */
  .toFactory(createApiService, (instance) => instance.init());
const apiServiceFactory = container.get(TOKENS.apiServiceFactory);
/*                 ↓ Will wait for the initialization resolution. */
const apiService = await apiServiceFactory();
expect(apiService).toBeInstanceOf(ApiService);