如何将服务注入必须在 angular 7 中的应用程序模块中实例化的 class?
How to inject a service into a class that must be instantiated in app module in angular 7?
我在项目中使用 ngxs,我想使用 ngxs 记录器插件,但我想覆盖记录器本身,以便我能够登录到后端。为此,我需要在我的记录器 class 中注入我的 RestService,但我无法这样做。我已经看到多个问题,其中询问如何将服务注入普通 classes,但这些情况并不能真正回答您必须在应用程序模块中手动实例化 class 的情况。 , and 是这样的回答对我没有帮助还是我没有掌握他们的知识。
这是我的应用程序模块导入中的内容:
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
];
这是我的记录器 class:
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
class 而不必传递这些我没有的参数。
这可能吗?如果没有,我应该怎么做?我希望能够使用 ngxs 记录器来存储操作日志,而不是在组件中创建自定义日志记录,但为此我需要记录器能够使用我的休息服务。
您可以尝试使用提供者工厂:
export function createLoggerPluginOptions(httpClient: HttpClient) {
return {
logger: new Logger(httpClient)
}
}
// and provide in the module:
{
provide: NGXS_LOGGER_PLUGIN_OPTIONS,
useFactory: (createLoggerPluginOptions),
deps: [HttpClient]
}
我在项目中使用 ngxs,我想使用 ngxs 记录器插件,但我想覆盖记录器本身,以便我能够登录到后端。为此,我需要在我的记录器 class 中注入我的 RestService,但我无法这样做。我已经看到多个问题,其中询问如何将服务注入普通 classes,但这些情况并不能真正回答您必须在应用程序模块中手动实例化 class 的情况。
这是我的应用程序模块导入中的内容:
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
];
这是我的记录器 class:
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
class 而不必传递这些我没有的参数。
这可能吗?如果没有,我应该怎么做?我希望能够使用 ngxs 记录器来存储操作日志,而不是在组件中创建自定义日志记录,但为此我需要记录器能够使用我的休息服务。
您可以尝试使用提供者工厂:
export function createLoggerPluginOptions(httpClient: HttpClient) {
return {
logger: new Logger(httpClient)
}
}
// and provide in the module:
{
provide: NGXS_LOGGER_PLUGIN_OPTIONS,
useFactory: (createLoggerPluginOptions),
deps: [HttpClient]
}