Как ввести сервис, использующий токен инъекции, используя инжектор в угловых 8 - PullRequest
0 голосов
/ 08 октября 2019

Я разрабатываю пакет, который используется двумя проектами в моей компании. В проекте 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 {}

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Цель этого токена инъекции - не использовать инжектор.

Вместо =, используйте этот синтаксис

constructor(@Inject('MESSAGE_SERVICE')protected service: YourInterface)

Хотя, если вы делаете сервис, я не вижу смысла в использовании токена инъекции.

0 голосов
/ 08 октября 2019

Вы можете создать библиотеку angular и затем использовать ее в любом количестве проектов

Вот как создать библиотеку angular2 https://makina -corpus.com / blog / metier / 2017 / how-для создания угловой библиотеки

с angular-cli https://medium.com/@nikolasleblanc/building-an-angular-4-component-library-with-the-angular-cli-and-ng-packagr-53b2ade0701e

...