A ServiceCollection is a mutable list of registrations until you call buildServiceProvider(). These methods let
libraries register defaults that applications can override, and let tests swap pieces out.
Method
Does
tryAddSingleton / tryAddScoped / tryAddTransient
Register only if the token has no plain registration yet
remove(token)
Remove every registration of the token, keyed ones included
replace(token, impl, deps?)
Swap the plain registrations for one new one, keeping the lifetime
has(token, key?)
Is it registered in this collection?
provider.isService(token, key?)
Is it registered in this provider? (false once disposed)
tryAdd* takes the same forms as add* and does nothing when the token already has a plain registration. Use it in
code that sets up defaults, so whoever registers first wins:
constlogger=await provider.getRequiredService(Logger); // typed as Logger
createToken<
interfaceLogger
Logger>('Logger');
class
classConsoleLogger
ConsoleLoggerimplements
interfaceLogger
Logger {
ConsoleLogger.log(msg: string): void
log(
msg: string
msg:string) {
var console:Console
The console module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
A Console class with methods such as console.log(), console.error() and console.warn() that can be used to write to any Node.js stream.
A global console instance configured to write to process.stdout and
process.stderr. The global console can be used without importing the node:console module.
Warning: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the note on process I/O for
more information.
Example using the global console:
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(newError('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
constname='Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
Example using the Console class:
constout=getStreamSomehow();
consterr=getStreamSomehow();
constmyConsole=new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(newError('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
Prints to stdout with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to printf(3)
(the arguments are all passed to util.format()).
The console module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
A Console class with methods such as console.log(), console.error() and console.warn() that can be used to write to any Node.js stream.
A global console instance configured to write to process.stdout and
process.stderr. The global console can be used without importing the node:console module.
Warning: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the note on process I/O for
more information.
Example using the global console:
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(newError('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
constname='Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
Example using the Console class:
constout=getStreamSomehow();
consterr=getStreamSomehow();
constmyConsole=new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(newError('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
Prints to stdout with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to printf(3)
(the arguments are all passed to util.format()).
Compare with add*, which appends: the last registration would win for getService, and getServices would return both.
Keyed registrations don’t count: tryAddSingleton(Logger, ...) still registers when only keyed Loggers exist.
replace drops the plain registrations of a token and adds one new registration with the lifetime of the last one
(singleton if there was none). Dependencies are type-checked like add*:
class
classFixedClock
FixedClockextends
classClock
Clock {
override
FixedClock.now(): Date
now() {
returnnew
var Date:DateConstructor
new (value:number|string|Date) =>Date (+3 overloads)
remove(token) deletes every registration of the token: all plain registrations and all keyed ones. It returns the
collection, so calls chain. (removeAll from @ylcnfrht/ioc is gone; remove does the same.)
Registers a keyed singleton, resolved with getKeyedService(token, key).
Keyed registrations are separate from plain ones: getService(token) never returns them.
services.has(token) checks plain registrations, services.has(token, key) a keyed one. On a built provider,
provider.isService(token, key?) answers the same question without resolving anything, and returns false after the
provider (or scope) is disposed.
if (
constprovider:ServiceProvider
provider.
ServiceProvider.isService<{
inc(name:string):void;
}>(token:Token<{
inc(name:string):void;
}>, key?:ServiceKey):boolean
True if token (or token with key) is registered. False once disposed.
isService(
constMetrics:InjectionToken<{
inc(name:string):void;
}>
Metrics)) {
const
constmetrics: {
inc(name:string):void;
}
metrics=await
constprovider:ServiceProvider
provider.
ServiceProvider.getRequiredService<{
inc(name:string):void;
}>(token:Token<{
inc(name:string):void;
}>):Promise<{
inc(name:string):void;
}>
Resolves token, throwing ServiceNotFoundError if it is not registered.
buildServiceProvider() copies the registrations. Adding, removing or replacing afterwards affects the next provider you
build, never one that already exists: