Dependency relationship
After creating identifiers and dependency items, you need to declare dependency relationship among dependencies. There are two types of dependency items that could dependent on others: class items and factory function items.
On a class
To declare dependencies of a class, you could use the Injector
decorator:
class MapService {
constructor(
@Inject(SatelliteService) private readonly satellite: SatelliteService,
) {}
}
or an IdentifierDecorator
:
interface IPlatformService {}
const IPlatformService = createIdentifier<IPlatformService>("platform");
class DialogService {
constructor(
@IPlatformService private readonly platformSrc: IPlatformService,
) {}
}
On a factory
You should list all its dependencies in the deps
property:
const item = [
I18NNumberTranspiler,
{
useFactory: (i18nService: I18NService) => {
return i18nService.isChinese()
? new ChineseNumberTranspiler()
: new EnglishNumberTranspiler();
},
deps: [I18NService],
},
];
Optional
When a dependency is not held by an injector, the injector would throw an error when you want to get that dependency.
class MapService {
constructor(
@Inject(SatelliteService) private readonly satellite: SatelliteService,
) {}
}
const injector = new Injector([[MapService]]);
injector.get(MapService); // ERROR!
You could use Optional
instead Inject
, to mark SatelliteService
as an optional dependency not a required one.
class MapService {
constructor(
@Optional(SatelliteService) private readonly satellite?: SatelliteService,
) {}
}
const injector = new Injector([MapService]);
injector.get(MapService);
In this case, MapService
could construct, but its property satellite
would be undefined.
Multiple
Similarly, you could use Many
to mark the dependency could be injected with multiple instances:
class MapService {
constructor(
@Many(ISatelliteService) private readonly satellites: ISatelliteService[],
) {}
}
const injector = new Injector([
[MapService],
[ISatelliteService, { useClass: GPSSatellite }],
[ISatelliteService, { useClass: BeidouSatellite }],
]);
injector.get(MapService);