2017-01-10 6 views
0

Я пытаюсь написать простой LoggerService для углового 2. При вызове метода logger.log('msg') этой службы регистратор должен автоматически префикс идентификатора класса вызывающего абонента. Итак, если звонок типа logger.log('hello') сделан из MyComponent, выход должен быть MyComponent: hello.Ввести новый экземпляр службы в другой службе в угловом 2

Для этого я создал providerFactory и службу, как показано ниже:

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

Как я могу добиться, чтобы придать новый экземпляр LoggerSerivce в другой @Injectable службы? Спасибо!

+0

Просто FYI, это выглядит как самая последняя AngularCLI теперь встроенный в Logger: https://github.com/angular/angular-cli/commit/e3b48da – Rodney

ответ

0

Вы не можете создать новый экземпляр службы!

сервис «singleton» класс .. (конструктор называется только один раз!).

вы должны получить имя класса в качестве параметра в функции «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 
    } 
} 

вы все равно пытаются создать несколько экземпляров службы.

Удачи !!!

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