在Angular 2中的另一个服务中注入新的服务实例

时间:2017-01-10 20:48:27

标签: angular dependency-injection

我正在尝试为角度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实例? 谢谢!

2 个答案:

答案 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');
}