@ez.dev/di
A light DI container implementation.
Usage
Basic
You can registry Class
, Factory
, Value
or `Alias.
import { Registry } from '@ez.dev/di'
class AuthService {}
const registry = new Registry()
const container = registry
.addClass(AuthService)
.addValue('foo', false)
.addFactory(Symbol.for('GlobalOptions'), () => ({ bar: true }))
.addAlias('baz', Symbol.for('GlobalOptions'))
.build()
assert(container.get(AuthService) instanceof AuthService)
assert(container.get('foo') === false)
assert(container.get(Symbol.for('GlobalOptions')).bar === true)
assert(container.get('baz').bar === true)
Scopped Container
Create injection sanbox by scopes
const root = new Registry().addValue('foo', 1)
const scopped = root.scopped().addValue('bar', 2)
const rootContainer = root.build()
const scoppedContainer = scopped.build()
rootContainer.get('foo')
scoppedContainer.get('foo')
rootContainer.get('bar')
rootContainer.tryGet('bar')
scoppedContainer.get('bar')
Dependencies Injection
Class
and Factory
providers that requires dependencies will be auto resolved. And typechecking is available during registering.
class Foo {}
class Bar {}
class Baz {
constructor(
private foo: Foo,
private bar: Bar,
) {}
}
const registry = new Registry()
registry
.addClass(Foo)
.addClass(Bar)
.addClass(Baz, [Foo, Bar])
.addFactory('GlobalBaz', (foo: Foo, bar: Bar) => new Baz(foo, bar), [Foo, Bar])
.build()