【问题标题】:How to inject a service into a class that must be instantiated in app module in angular 7?如何将服务注入必须在 Angular 7 中的应用程序模块中实例化的类中?
【发布时间】:2019-04-25 00:31:43
【问题描述】:

我在一个项目中使用 ngxs,我想使用 ngxs 记录器插件,但我想覆盖记录器本身,以便能够登录到后端。为此,我需要在我的记录器类中注入我的 RestService,但我无法这样做。我见过多个问题,询问如何将服务注入普通类,但这些案例并不能真正回答您必须在应用程序模块中手动实例化类的情况。 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 记录器来存储操作日志,而不是在组件中创建自定义日志记录,但为此我需要记录器能够使用我的休息服务。

【问题讨论】:

    标签: angular angular7 ngxs angular-dependency-injection


    【解决方案1】:

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

    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

    【讨论】:

    • 作为记录器NgxsLoggerPluginModule.forRoot({ collapsed: false, logger: new Logger() }),我会在记录器插件中添加什么?
    • {... logger: Logger ...} 应该可以完成这项工作。
    • 我很抱歉地说,但它不起作用。它需要一个 Logger 类的实例,如果我直接传递该类,即使您在提供程序中使用您的代码,它也会说 logger.log 不是一个函数。
    • 确实有效!感谢您的回答,对您有很大帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 2016-11-29
    • 1970-01-01
    • 2020-06-18
    • 2018-06-18
    • 2013-07-30
    • 1970-01-01
    相关资源
    最近更新 更多