Я разрабатываю пакет, который используется двумя проектами в моей компании. В проекте A и только там мы получили службу сообщений, которая предоставляется в core.module
следующим образом:
{
provide: 'MESSAGE_SERVICE',
useClass: MessageService
}
В моем компоненте мне нужно внедрить эту службу. Я делаю это, используя injector
. Однако метод get
, который принимает строку в качестве параметра, устарел, поэтому я не могу его использовать, хотя он работает. Когда я пытаюсь использовать новый API с InjectionToken
, я всегда получаю неопределенное значение. Вот мой код:
protected messageService: any;
constructor(protected injector: Injector) {
const messageServiceInjectionToken = new InjectionToken('MESSAGE_SERVICE');
// i get null
this.messageService = this.injector.get<any>(messageServiceInjectionToken, null, InjectFlags.Optional);
// It works but method is deprecated
this.messageService = this.injector.get('MESSAGE_SERVICE', null);
// It works but I cannot use MessageService class directly as it is not present in application B
this.messageService = this.injector.get(MessageService);
}
Как правильно получить мой сервис без прямого импорта указанного класса? Я думал о создании фиктивного класса в проекте B, чтобы я мог использовать класс MessageService
. Тем не менее, я хотел бы знать, есть ли лучший способ.
РЕДАКТИРОВАТЬ
Общая служба является просто базовым классом для других реализаций, она предоставляется с использованиемфабрика, поэтому в ней нет внедрения зависимостей. Вот как это обеспечивается:
export function parentServiceFactory(platformService: PlatformService, injector: Injector) {
if (platformService.isIOS) {
return new IosChildService(injector);
}
if (platformService.isAndroid) {
return new AndroidChildService(injector);
}
return new DesktopChildService(injector);
}
@NgModule({
providers: [
{
provide: ParentService,
useFactory: parentServiceFactory,
deps: [PlatformService, Injector]
}
]
})
export class SharedModule {}