Как внедрить сервис в класс, который должен быть создан в модуле приложения в angular 7? - PullRequest
0 голосов
/ 22 ноября 2018

Я использую ngxs в проекте, и я хочу использовать плагин ngxs logger, но я хочу переопределить сам logger, чтобы я мог войти в бэкэнд.Для этого мне нужно добавить мой RestService в мой класс логгера, но я не могу этого сделать.Я видел несколько вопросов, где спрашивали, как внедрить сервисы в простые классы, но эти случаи на самом деле не отвечают случаю, когда вы должны вручную создать экземпляр класса в модуле приложения. Это , , это и , это - это такие ответы, которые не помогли мне или я не смог понять их знания.

Вот что у меня естьв импорте модуля моего приложения:

export const APP_MODULE_IMPORTS = [
  NgxsModule.forRoot([
    NewsState,
    NewsAdminState,
  ]),
  NgxsReduxDevtoolsPluginModule.forRoot(),
  NgxsLoggerPluginModule.forRoot({
    collapsed: false,
    logger: new Logger(/* Need somehow to have an instance of the RestService HERE without having to pass all other dependencies */)
  }),
  BrowserModule,
  HttpClientModule,
  FormsModule,
  ReactiveFormsModule,
  routing
];

А вот мой класс регистратора:

import { RestService } from 'my-angular-modules';

@Injectable()
export class Logger {

  constructor(private restService: RestService) {
  }

  public log(title, color, payload): void {
    console.log(title, 'title');
    console.log(color, 'color');
    console.log(payload, 'payload');
  }

  public groupCollapsed(message): void {
    console.groupCollapsed(message);
  }

  public group(message): void {
    console.group(message);
  }

  public groupEnd(): void {
    console.groupEnd();
  }
}

Я не могу передать экземпляр службы отдыха напрямую, потому что мне пришлось бы передавать каскад зависимостей.Я также попытался использовать токены инъекций и добавить { provide: LOGGER_INJECTION_TOKEN, useClass: RestService } к провайдерам, но дошел до той же точки.Я не знаю, как создать экземпляр класса Logger в этот момент без необходимости передавать эти аргументы, которых у меня нет.

Возможно ли это вообще?Если нет, то как мне это сделать?Я хочу использовать регистратор ngxs для хранения журналов действий вместо создания настраиваемой регистрации в компонентах, но для этого мне нужен регистратор, чтобы использовать мою службу отдыха.

1 Ответ

0 голосов
/ 22 ноября 2018

Вы можете попробовать использовать фабрику провайдеров:

export function createLoggerPluginOptions(httpClient: HttpClient) {
  return {
    logger: new Logger(httpClient)
  }
}


// and provide in the module:
{
  provide: NGXS_LOGGER_PLUGIN_OPTIONS,
  useFactory: (createLoggerPluginOptions),
  deps: [HttpClient]
}

Вот рабочий пример: https://stackblitz.com/edit/ngxs-custom-logger

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...