Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/northern/di.js
An easy to use Dependency Injection Container for JavaScript & TypeScript
https://github.com/northern/di.js
container dependency-injection di-container inversion-of-control javascript typescript
Last synced: about 16 hours ago
JSON representation
An easy to use Dependency Injection Container for JavaScript & TypeScript
- Host: GitHub
- URL: https://github.com/northern/di.js
- Owner: northern
- License: mit
- Created: 2018-06-14T01:17:52.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2024-08-24T07:52:58.000Z (3 months ago)
- Last Synced: 2024-11-10T20:02:21.951Z (4 days ago)
- Topics: container, dependency-injection, di-container, inversion-of-control, javascript, typescript
- Language: TypeScript
- Homepage: https://www.npmjs.com/package/@northern/di
- Size: 354 KB
- Stars: 1
- Watchers: 4
- Forks: 1
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# DI
A simple Dependency Injection container for JavaScript & TypeScript.
## Install
Either use npm:
npm install @northern/di
or Yarn:
yarn add @northern/di
## Introduction
To use DI in your application simply import (or require) the `Container` and create a `Container` instance:
````
import Container from '@northern/di'const container = new Container()
````
With the newly instantiated container, you can start registering services. There are two ways you can register a service, either use the `service` method or you can use the `factory` method.## Registering a service
With the `service` method a new service provider can be registered. The `service` method takes three parameters:
Container.service(name, provider[, lazy = true, overwrite = false])
The `name` is a string with the "name" of the service, e.g. `logger`. The `provider` is a function that, when called, "returns" the service instance. The `lazy` parameter specifies whether the service is "lazy" or not, more on that later and the `overwrite` parameter allows you to re-register a service if it already exists in the service registry of the container (handy during integration tests when you want to swap a service with a mock).
A "service" instance is only ever created once (as opposed to a factory, which returns a new instance of the service each time).
Let's look at a simple service registration example:
````
class Logger {
info(message) {
console.info(message)
}
}container.service('logger', container => {
return new Logger()
})
````
It's that simple. We can now get the "logger" service by using the `get` method on the container:
````
const logger = container.get('logger')logger.info("Hello DI")
````
Since the `Container` instance is passed into the service provider, it is possible to "wire" multiple services together (i.e. create service dependencies by having one service require another already registered service). A service provider can use already registered services and "inject" them into other services. E.g. if we register a service then we can pass an instance of the `logger` service into that other service:
````
class PaymentService {
constructor(logger) {
this.logger = logger
}processPayment(paymentObject) {
this.logger.info("Starting payment process.")
}
}container.service('paymentService', container => {
const logger = container.get('logger')const service = new PaymentService(logger)
return service
})const paymentService = container.get('paymentService')
paymentService.processPayment({ ... })
````### Lazy services
When a service is not "lazy" then the instance of that service will be created the moment the service is registered (i.e. when the `service` method is called). This is not usually desireable (and why `lazy` by default is `true`). E.g. if the dependency graph is large and not all services are always used, i.e. usage depends of the code path of the application, it might be better to instantiate a service on a need by need basis. This what a "lazy" service does; the instance is created the first time the service is requested rather than when the service was registered.
## Registering a factory
With the `factory` method a new factory provider can be created. A factory will always return a new instance each time it is requested from the container. The factory registration is the same as that of a service except that a factory cannot be lazy (i.e. its always lazy).
The `factory` method only has three parameters:
Container.factory(name, provider[, overwrite = false])
That's it. Have fun wiring!