servicemanager
Version:
Most basic implementation of dependency injection container for JavaScript
246 lines (166 loc) • 6.82 kB
Markdown
[![build status][build-image]][build-url]
[![npm version][npm-image]][npm-url]
[![npm download][npm-download-image]][npm-url]
[![dependencies][dep-image]][dep-url]
[![coverage status][coverage-image]][coverage-url]
[![license][license-image]][license-url]
ServiceManager is probably the most basic implementation of dependency injection container for JavaScript.
Execute `npm install servicemanager` or `yarn add servicemanager` to install servicemanager and its dependencies into your project directory.
To register objects to service manager, create a file/module for your service context:
```js
//
// serviceContext.js
//
import { createContext, factory, singleton } from 'servicemanager';
const context = createContext(
[ 'ResourceManager', factory(DefaultResourceManager) ],
[ 'CacheManager', factory(CustomCacheManager) ],
[ 'SessionManager', singleton(mySessionManager) ]
);
```
To get objects back from service manager:
```js
//
// anotherFile.js
//
import useServiceManager from 'servicemanager';
// get default service context
const context = useServiceManager();
// returns a new instance for DefaultResourceManager
const resourceManager = context.get('ResourceManager');
// returns a new instance for CustomCacheManager
const cacheManager = context.get('CacheManager');
// returns the same session manager object that referenced by mySessionManager
const sessionManager = context.get('SessionManager');
```
Alternatively, to get all needed instances at once:
```js
//
// anotherFile2.js
//
import useServiceManager from 'servicemanager';
// get default service context
const context = useServiceManager();
const [ resourceManager, cacheManager, sessionManager ] = context.getRange('ResourceManager', 'CacheManager', 'SessionManager');
```
...Or, to have them in more promise-friendly way:
```js
//
// anotherFile3.js
//
import useServiceManager from 'servicemanager';
// get default service context
const context = useServiceManager();
context.ensure([ 'ResourceManager', 'CacheManager', 'SessionManager' ], (resourceManager, cacheManager, sessionManager) => {
// awaits promisified generator functions first,
// then services dependencies as parameters
});
```
*** Note: Service names can be anything including objects, symbols or strings.
To register objects to service manager, create a file/module for your service context:
```js
//
// serviceContext.js
//
import { createContext, factory, singleton } from 'servicemanager';
const context = createContext(
[ 'ResourceManager', factory(DefaultResourceManager) ],
[ 'CacheManager', factory(CustomCacheManager) ],
[ 'SessionManager', singleton(mySessionManager) ]
);
export {
context as default,
};
```
To get objects back from service manager:
```js
//
// anotherFile.js
//
import { get } from 'servicemanager';
import context from './serviceContext.js';
// returns a new instance for DefaultResourceManager
const resourceManager = get(context, 'ResourceManager');
// returns a new instance for CustomCacheManager
const cacheManager = get(context, 'CacheManager');
// returns the same session manager object that referenced by mySessionManager
const sessionManager = get(context, 'SessionManager');
```
Alternatively, to get all needed instances at once:
```js
//
// anotherFile2.js
//
import { getRange } from 'servicemanager';
import context from './serviceContext.js';
const [ resourceManager, cacheManager, sessionManager ] = getRange(context, 'ResourceManager', 'CacheManager', 'SessionManager');
```
...Or, to have them in more promise-friendly way:
```js
//
// anotherFile3.js
//
import { ensure } from 'servicemanager';
import context from './serviceContext.js';
ensure(context, [ 'ResourceManager', 'CacheManager', 'SessionManager' ], (resourceManager, cacheManager, sessionManager) => {
// awaits promisified generator functions first,
// then services dependencies as parameters
});
```
*** Note: Service names can be anything including objects, symbols or strings.
**ServiceContext.prototype methods**
```
constructor(...definitions: ServiceDefinitions)
get(dependency: any): any
getRange(...dependencies: Array<any>): Array<any>
ensure(dependencies: Array<any>, callback: (...services: Array<any>) => any): Promise<any>
all(): Array<string>
filter(predicate: FilterPredicate): Array<string>
filterByTag(tag: string): Array<string>
```
## Mechanics
Factory services call generator/dependency target each time they are requested,
whereas, Singleton services are registered when they are defined.
```js
import createContext, { factory, singleton } from 'servicemanager';
const date1 = Symbol('date1');
const date2 = Symbol('date2');
const context = createContext(
[ date1, factory(() => new Date()) ],
[ date2, singleton(new Date()) ]
);
console.log(context.get(date1)); // calls and returns new Date()
console.log(context.get(date1)); // calls and returns new Date() again,
console.log(context.get(date2)); // no calls, returns stored date.
```
See [GitHub Projects](https://github.com/eserozvataf/servicemanager/projects) for more.
* node.js (https://nodejs.org/)
Apache 2.0, for further details, please see [LICENSE](LICENSE) file
See [contributors.md](contributors.md)
It is publicly open for any contribution. Bugfixes, new features and extra modules are welcome.
* To contribute to code: Fork the repo, push your changes to your fork, and submit a pull request.
* To report a bug: If something does not work, please report it using [GitHub Issues](https://github.com/eserozvataf/servicemanager/issues).
[](https://www.patreon.com/eserozvataf)
[]: https://img.shields.io/travis/eserozvataf/servicemanager.svg?style=flat-square
[]: https://travis-ci.org/eserozvataf/servicemanager
[]: https://img.shields.io/npm/v/servicemanager.svg?style=flat-square
[]: https://img.shields.io/npm/dt/servicemanager.svg?style=flat-square
[]: https://www.npmjs.com/package/servicemanager
[]: https://img.shields.io/david/eserozvataf/servicemanager.svg?style=flat-square
[]: https://github.com/eserozvataf/servicemanager
[]: https://img.shields.io/codecov/c/github/eserozvataf/servicemanager.svg?style=flat-square
[]: https://codecov.io/gh/eserozvataf/servicemanager
[]: https://img.shields.io/npm/l/servicemanager.svg?style=flat-square
[]: https://github.com/eserozvataf/servicemanager/blob/master/LICENSE