2017-01-10 11 views
0

角度2の単純なLoggerServiceを書こうとしています。このサービスのlogger.log('msg')メソッドを呼び出すと、ロガーは自動的に呼び出し元クラスの識別子に接頭辞を付ける必要があります。 logger.log('hello')のようなコールがMyComponentから作成された場合、出力はMyComponent: helloになります。角2の別のサービスで新しいサービスインスタンスを注入

そうするためには、私がproviderFactoryと以下のようにサービスを作成しました:

@Component({ 
    templateUrl: 'myComponent.html', 
    providers: [provideLogger('MyComponent')] 
}) 
export class MyComponent { 
    constructor(private logger: LoggerService){ 
     logger.log('Hello'); //outputs: MyComponent: Hello 
    } 
} 

私が直面しています問題を:以下のように使用、コンポーネントを使用するとき

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

これは正常に動作しますここには:私はこのLoggerServiceの新しいインスタンスを他のサービスに挿入できません(以下はサンプルApiServiceです)。私が理解しているように、インジェクターは、他のサービスを注入するためのサービスレベルでは利用できません。

@Injectable() //can't mentioned providerFunction 
export class ApiService { 
constructor(private logger: LoggerService) { 
    logger.log('hello api'); //should output ApiService: hello api 
    } 
} 

LoggerSerivceの新しいインスタンスを別の@Injectableサービスにインジェクトする方法を教えてください。 ありがとう!

+0

最近のAngularCLIには、LoggeRが組み込まれているようです。https://github.com/angular/angular-cli/commit/e3b48da – Rodney

答えて

0

サービスの新しいインスタンスを作成することはできません!

サービスは "シングルトン"クラスです(コンストラクターは一度だけ呼び出されます)。

"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 
    } 
} 

とにかくサービスの複数のインスタンスを作成しようとしています。

Good Luck !!!私はどうなるのか

+0

私は同じことを避けようとしています(ログ呼び出しごとに追加のパラメータを渡します)。サービスの新しいインスタンスは、コンポーネントレベルで提供されるときに作成され、その部分はうまく機能します。サービスからログを取るためにこれを処理する方法を理解できません。 –

+0

サービスの代わりに通常のクラスを使用できます。 サービスの重複インスタンスが作成されている可能性があります。 – YairTawil

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'); 
} 
関連する問題