Service Registry
Installation
npm install dd-service-registry
# or when using Yarn
yarn add dd-service-registry
Usage
The ServiceRegistry is exported as a singleton. But you can also use the exported class to create an own ServiceRegistry.
import registry from 'dd-service-registry';
You can define your own argument resolvers. It's highly recommended to set the DependencyResolver
to get DI working.
But you can also define your own argument/dependency resolver.
import DependencyResolver from 'dd-service-registry/argument-resolver/DependencyResolver';
registry.addArgumentResolver(new DependencyResolver());
Then you can start to register your services. Each service is represented by an service-configuration (see below).
registry.register('foo', Foo);
registry.register('bar', Bar, ['@foo']);
registry.register('baz', Baz, ['@foo', '@bar']);
After register your services you can start using them.
const foo = registry.get('foo');
Service configuration
registry.register(name: string, service: Class, args?: Array<any>, options?: Object)
args
Could be anything. Each arg is checked by all argument resolvers. For example: if you use the DependencyResolver
you
can resolve dependencies by passing an string like @dependency
as argument and you'll get the resolved dependency
instead of the string @dependency
in your registered service injected.
options
key | type | Description |
---|---|---|
methodCalls |
Array<Array<string>> |
call methods after initialized the service. |
tags |
Array<string> |
tags to identify multiple services |
Recursive dependencies
To avoid recursive dependencies you can pass the registry itself as dependency:
registry.register('foo', Foo, ['@registry']);
Complex example
import registry from 'dd-service-registry';
import DependencyResolver from 'dd-service-registry/argument-resolver/DependencyResolver';
import ServiceA from 'serviceA';
import ServiceB from 'serviceB';
import ServiceC from 'serviceC';
import ServiceD from 'serviceD';
registry.addArgumentResolver(new DependencyResolver());
registry.register('serviceA', ServiceA, [], {
methodCalls: [
['someMethod', 'some', 'arg'],
],
tags: ['foo'],
});
registry.register('serviceB', ServiceB, ['@serviceA']);
registry.register('serviceC', ServiceC, [], {
methodCalls: [
['setService', '@serviceB'],
],
});
registry.register('serviceD', ServiceD, [], {
methodCalls: [
['setServices', '$foo'],
],
});
Argument resolver
You can build your own argument resolver and plug it into the registry. Implement the following interface and use the
addArgumentResolver
method in the registry.
interface Resolver {
constructor(registry: ServiceRegistry);
supports(argument: any): boolean;
resolve(argument: any): any;
}
You can also extend the AbstractResolver
.
Built in resolver
-
DependencyResolver
- uses@
notation to resolve depndencies -
TagResolver
- uses$
notation to resolve tagged services