Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Посоветуйте как правильно подключить библиотеку (https://javascript.ru/forum/angular/77505-posovetujjte-kak-pravilno-podklyuchit-biblioteku.html)

Faab 14.05.2019 12:22

Посоветуйте как правильно подключить библиотеку
 
Есть три библиотеки: ParentA, ChildA и ChildB.

Библиотеке ParentA при подключении требуется объект parent_a_config: ParentAModuleOptions при подключении в app.module.ts:

// app.module.ts
import 'ParentAModuleOptions, ParentAModule' from '@example/parent-a';
const parent_a_config: ParentAModuleOptions = {
  a: environment.a,
  b: environment.b
};

// ... 
  imports: [
    // ... 
   ParentAModule.forRoot(parent_a_config),
   // ...
  ],
// ...



// parent-a.module.ts
export class ParentAModule {
  static forRoot(options?: ParentAModuleOptions): ModuleWithProviders {
    return {
      ngModule: ParentAModule,
      providers: [
        {
          provide: PARENT_A_OPTIONS_TOKEN,
          useValue: options,
        }
      ]
    };
  }
}


// parent-a.service.ts

  // ... 
  constructor(
    @Inject(PARENT_A_OPTIONS_TOKEN) private config: ParentAModuleOptions
  ) {
    this.setConfig(config);
  }
  // ...


Библиотеки ChildA и ChildB используют сервис библиотеки ParentA. Это значит в package.json файле каждой библиотеки прописано следующее:
Код:

{
  "name": "@example/child-x",
  "version": "1.0.0",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://example.git"
  },
  "dependencies": {
    "@example/parent-a": "^1.0.0",
  }
}

И при использовании сервиса ParentAService в сервисе ChildAService, сервис подключается напрямую из node_modules:
// child-a.service.ts
import 'ParentAService' from '@example/parent-a';

  // ... 
  constructor(
    @Inject(CHILD_A_OPTIONS_TOKEN) private config: ChildAModuleOptions,
    private parent_a_service: ParentAService
  ) {
    this.setConfig(config);
  }
  // ...


Но ведь библиотеке ParentA нужно передать объект конфига, а я не понимаю как это сделать ВНЕ app.module.ts.

И ещё, библиотеки ChildA и ChildB используют сервис ParentAService, так как у каждой библиотеки установлена в node_modules своя ParentA библиотека. Это получается что образуется два экземпляра класса ParentAService? Разве экземпляр класса (любого) сервиса не должен быть дитём синглтона?

Подскажите как архитектурно правильно подойти в использовании ParentAService в ChildA и ChildB библиотеках.

destus 15.05.2019 09:21

Цитата:

И ещё, библиотеки ChildA и ChildB используют сервис ParentAService, так как у каждой библиотеки установлена в node_modules своя ParentA библиотека
Им что нужны разные версии parent-a блиблиотеки? Иначе npm не создает локальные node_modules. Попробуйте в child библиотеках вместо dependencies указывать peerDependencies.
Цитата:

Разве экземпляр класса (любого) сервиса не должен быть дитём синглтона?
Нет, не всегда. Например, определяя сервисы в Shared модуле и импортируя этот модуль в так называемые lazy-load модули.

Faab 04.06.2019 10:08

Цитата:

Сообщение от destus (Сообщение 507775)
Им что нужны разные версии parent-a блиблиотеки? Иначе npm не создает локальные node_modules. Попробуйте в child библиотеках вместо dependencies указывать peerDependencies.

Нет, не всегда. Например, определяя сервисы в Shared модуле и импортируя этот модуль в так называемые lazy-load модули.

Да, использование peerDependencies полностью решает задачи, которые я хотел решить.
Глобальная установка конфигов (DI) всех используемых библиотек происходит в app.module.ts, и это, на мой взгляд, удобно.

Спасибо.


Часовой пояс GMT +3, время: 06:29.