我正在尝试为角度2编写一个简单的LoggerService
。在调用此服务的logger.log('msg')
方法时,记录器应自动为调用者类标识符添加前缀。
因此,如果logger.log('hello')
之类的调用来自MyComponent
,则输出应为MyComponent: hello
。
为此,我创建了一个providerFactory和Service,如下所示:
export function provideLogger(sourceClass: string) {
return {
provide: LoggerService,
useFactory: (config: LogConfig) => new LoggerService(sourceClass, config),
deps: ['LogConfig'] //LogConfig is a simple JS object common for application
};
}
@Injectable()
export class LoggerService {
constructor(private sourceClass:string, private config: LogConfig) { }
log(message: string) {
console.log(`${this.sourceClass}: ${message}`);
}
}
使用组件时效果很好,如下所示:
@Component({
templateUrl: 'myComponent.html',
providers: [provideLogger('MyComponent')]
})
export class MyComponent {
constructor(private logger: LoggerService){
logger.log('Hello'); //outputs: MyComponent: Hello
}
}
我面临的问题是:我无法在任何其他服务中注入此LoggerService
的新实例(下面是示例ApiService)。据我了解,注射器在服务级别不能用于注射其他服务。
@Injectable() //can't mentioned providerFunction
export class ApiService {
constructor(private logger: LoggerService) {
logger.log('hello api'); //should output ApiService: hello api
}
}
如何在另一个@Injectable
服务中注入新的LoggerSerivce实例?
谢谢!
答案 0 :(得分:0)
您无法创建新的服务实例!
服务是"单身" class ..(构造函数只调用一次!)。
你应该在" log"中获取类名作为参数。功能。
log(sourceClass:string, message: string) {
console.log(`${sourceClass}: ${message}`);
}
logger.log('MyComponent', 'Hello'); //outputs: MyComponent: Hello
或: 使用普通类而不是服务。 例如:
@Injectable()
export class ApiService {
private logger: LoggerService;
constructor( private config: LogConfig) {
this.logger = new LoggerService("ApiService", config)
this.logger.log('hello api');
}
}
@Component({
templateUrl: 'myComponent.html'
})
export class MyComponent {
private logger: LoggerService;
constructor(private config: LogConfig){
this.logger = new LoggerService("MyComponent", config)
this.logger.log('Hello'); //outputs: MyComponent: Hello
}
}
无论如何,你都试图创建多个服务实例。
祝你好运!!!
答案 1 :(得分:0)
我要做的是拥有通用日志功能:
public log(prefix: string, message: string);
还有另一个函数,它会为我调整参数:
public getLogger<T>(prefix: string) {
return (message: string) => this.log(prefix, message);
}
然后我可以这样使用它:
private LOGGER = this.loggerService.getLogger('MyService');
fun doSomething() {
this.LOGGER('My important message');
}