Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.05.2019, 12:22
Профессор
Отправить личное сообщение для Faab Посмотреть профиль Найти все сообщения от Faab
 
Регистрация: 16.04.2012
Сообщений: 310

Посоветуйте как правильно подключить библиотеку
Есть три библиотеки: 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 библиотеках.

Последний раз редактировалось Faab, 14.05.2019 в 12:37.
Ответить с цитированием
  #2 (permalink)  
Старый 15.05.2019, 09:21
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Цитата:
И ещё, библиотеки ChildA и ChildB используют сервис ParentAService, так как у каждой библиотеки установлена в node_modules своя ParentA библиотека
Им что нужны разные версии parent-a блиблиотеки? Иначе npm не создает локальные node_modules. Попробуйте в child библиотеках вместо dependencies указывать peerDependencies.
Цитата:
Разве экземпляр класса (любого) сервиса не должен быть дитём синглтона?
Нет, не всегда. Например, определяя сервисы в Shared модуле и импортируя этот модуль в так называемые lazy-load модули.
Ответить с цитированием
  #3 (permalink)  
Старый 04.06.2019, 10:08
Профессор
Отправить личное сообщение для Faab Посмотреть профиль Найти все сообщения от Faab
 
Регистрация: 16.04.2012
Сообщений: 310

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

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

Спасибо.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно настроить очерёдность выполнения функций? Altai Общие вопросы Javascript 8 01.02.2017 19:32
Как подключить class к window.location для открытия ссылки в popup окне? Sergey771 Общие вопросы Javascript 0 19.11.2016 12:34
Как подключить библиотеку JQuery к Wordpress? dimasheff Сайт Javascript.ru 1 27.07.2016 12:01
filter(this,this) как правильно сделать? Smip jQuery 5 23.02.2013 03:07
Как правильно очистить maxlength в input? Маэстро Events/DOM/Window 10 22.06.2011 18:14