A minimalist dependency injection framework for node.js.
Example
Create a container
Create a new container by calling dependable.container
:
var dependable = container = dependable;
Register some dependencies
Register a few dependencies for later use (a string and an object):
container;container;
Register a dependency that has other dependencies
When the argument is a function, the function's arguments are automatically populated with the correct dependencies, and the return value of the function is registered as the dependency:
container;
Register a dependency out-of-order
song
depends on a legalStatus
, which hasn't been registered yet.
Dependable resolves dependencies lazily, so we can define this dependency
after-the-fact:
container;
Resolve a dependency and use it
Like with container.register, the function arguments are automatically resolved, along with their dependencies:
container;
Re-register dependencies
As it stands, song
returns boring, non-catchy lyrics. One way to change its behavior
is to re-register its dependencies:
container;container;
This is really useful in a number of situations:
- A container can register configuration parameters for an application---for example, a port---and allows them to be changed later
- Dependencies can be replaced with mock objects in order to test other dependencies
To resolve the updated dependencies, provide an empty override:
container;
Override dependencies at resolve time
It's also possible to override dependencies at resolve time:
var horse = type: 'horse' material: 'steel'; container;
Sounds like a hit!
API
container.register(name, function)
- Registers a dependency by name. function
can be a function that takes dependencies and returns anything, or an object itself with no dependencies.
container.register(hash)
- Registers a hash of names and dependencies. This is useful for setting configuration constants.
container.load(fileOrFolder)
- Registers a file, using its file name as the name, or all files in a folder. Does not traverse subdirectories.
container.get(name, overrides = {})
- Returns a dependency by name, with all dependencies injected. If you specify overrides, the dependency will be given those overrides instead of those registered.
container.getSandboxed(name, overrides = {})
- Returns a dependency by name, with all dependencies injected. Unlike get
, you must specify overrides for all dependencies. This can (and should) be used during testing to ensure a module under test has been competely isolated.
container.resolve(overrides={}, cb)
- Calls cb
like a dependency function, injecting any dependencies found in the signature. Like container.get
, this supports overrides.
container.list()
- Return a list of registered dependencies.
Development
Dependable is written in coffeescript. To generate javascript, run npm run prepublish
.
Tests are written with mocha. To run the tests, run npm test
.