Page Contents
Service Decorator
@service
injects an instance of a given service from a binding matching the
service interface.
Syntax:
@service(serviceInterface: ServiceInterface, metadata?: InjectionMetadata)
The service interface can be a class. For example:
class MyController {
constructor(@service(MyService) public myService: MyService) {}
}
If the service is modeled as a TypeScript interface, we need to use a string or symbol to represent the interface as TypeScript interfaces cannot be reflected at runtime.
const MyServiceInterface = 'MyService';
class MyController {
constructor(@service(MyServiceInterface) public myService: MyService) {}
}
const MyServiceInterface = Symbol('MyService');
class MyController {
constructor(@service(MyServiceInterface) public myService: MyService) {}
}
If the service interface is not specified, it can be inferred from TypeScript design:type metadata.
class MyController {
// MyService is inferred from TypeScript design type
constructor(@service() public myService: MyService) {}
}
Please note the class has to be bound to the context with toClass() or a
matching tag named serviceInterface
.
const ctx = new Context();
ctx.bind('my-service').toClass(MyService); // The service interface is MyService
or
import {CoreTags, asService} from '@loopback/core';
const myService = new MyService();
ctx
.bind('my-service')
.to(myService)
.tag({[CoreTags.SERVICE_INTERFACE]: MyService});
ctx.bind('my-sub-service').toClass(MySubService).apply(asService(MyService));
The services can also be registered with Application
:
const app: Application = ...;
app.service(MyService);
app.service(MySubService, {serviceInterface: MyService});