如何将服务注入必须在angular 7的app模块中实例化的类中?

时间:2018-11-22 10:35:23

标签: angular angular7 ngxs angular-dependency-injection

我在项目中使用ngxs,并且想使用ngxs记录器插件,但是我想覆盖记录器本身,以便能够登录到后端。为此,我需要在我的记录器类中注入RestService,但是我不能这样做。我看到了多个问题,询问如何将服务注入到普通类中,但是这些情况并不能真正回答必须在app模块上手动实例化该类的情况。 Thisthisthis这类答案无法帮助我或我无法掌握他们的知识。

这是我在应用模块导入中的内容:

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();
  }
}

我不能直接传递rest服务的实例,因为我必须传递一系列的依赖关系。 我也尝试使用注入令牌并将{ provide: LOGGER_INJECTION_TOKEN, useClass: RestService }添加到提供程序,但我到了同一点。我不知道如何在不传递这些我没有的参数的情况下实例化Logger类。

这甚至可能吗?如果没有,我应该怎么做?我希望能够使用ngxs记录器来存储操作的日志,而不是在组件中创建自定义日志,但是为此,我需要记录器能够使用我的rest服务。

1 个答案:

答案 0 :(得分:2)

您可以尝试使用提供程序工厂:

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