如何在Angular 2应用程序模块和decorator之间共享服务实例?

如何在Angular 2应用程序模块和decorator之间共享服务实例?,angular,typescript,Angular,Typescript,我理解Angular 2服务,如果在根组件中注入一个,那么所有子组件都共享该服务的相同实例 我有一个日志服务,我想在我的装饰程序和应用程序中使用。但是我想重用根组件中的现有服务实例 现在,如果我在日志服务构造函数中放入调试器语句,我的服务将被实例化多次。我正在使用ReflectiveInjector,但我认为它正在创建一个新实例,而不是使用全局实例 也许我做错了,或者我缺乏理解。我这样做的原因是,我在日志服务中有一个可观察的流,多个实例创建多个可观察的流 @Injectable() export

我理解Angular 2服务,如果在根组件中注入一个,那么所有子组件都共享该服务的相同实例

我有一个日志服务,我想在我的装饰程序和应用程序中使用。但是我想重用根组件中的现有服务实例

现在,如果我在日志服务构造函数中放入调试器语句,我的服务将被实例化多次。我正在使用
ReflectiveInjector
,但我认为它正在创建一个新实例,而不是使用全局实例

也许我做错了,或者我缺乏理解。我这样做的原因是,我在日志服务中有一个可观察的流,多个实例创建多个可观察的流

@Injectable()
export class LoggerService {

    private _applicationLog$: ReplaySubject<string>;
    get applicationLog$(): Observable<string> {
        return this._applicationLog$.asObservable();
    }

    constructor(private $localStorage: LocalStorageService, private $appSettings: AppSettings) {
        this._applicationLog$ = <ReplaySubject<string>>new ReplaySubject();
    }

    log(s: string){
       //log to a file and push into the stream
       this._applicationLog$.next(s);
    }
}
@Injectable()
导出类日志服务{
private _applicationLog$:ReplaySubject;
获取applicationLog$():可观察{
返回此项。_applicationLog$.asObservable();
}
构造函数(private$localStorage:LocalStorageService,private$appSettings:appSettings){
此._applicationLog$=新的ReplaySubject();
}
日志(s:字符串){
//登录到文件并推入流
此._applicationLog$.next;
}
}
现在这是我的日志装饰器

var injector = ReflectiveInjector.resolveAndCreate([LocalStorageService, AppSettings]);
var service = <LoggerService>injector.resolveAndInstantiate(LoggerService);
var appSettings = <AppSettings>injector.resolveAndInstantiate(AppSettings);

function getTime() {
    let now = new Date();
    let min = ("00" + now.getMinutes()).substr(-2, 2);
    let hours = ("00" + now.getHours()).substr(-2, 2);
    return `${hours}:${min}`;
}

function log(message) {
    service.log(`[${getTime()}] ${message}`);
}

export function Trace() {
    return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
        if (AppSettings.logSeverity !== LogSeverity.Trace) return;
        log(`TRACE ${propertyKey}.enter()`);
    };
}
var injector=ReflectiveInjector.resolveAndCreate([LocalStorageService,AppSettings]);
var服务=注入器解析和安装(LoggerService);
var-appSettings=injector.resolveandistantate(appSettings);
函数getTime(){
让我们现在=新日期();
让min=(“00”+now.getMinutes()).substr(-2,2);
设小时=(“00”+now.getHours()).substr(-2,2);
返回`${hours}:${min}`;
}
功能日志(消息){
log(`[${getTime()}]${message}`);
}
导出函数跟踪(){
返回函数(目标:any,propertyKey:string,描述符:PropertyDescriptor){
if(AppSettings.logSeverity!==logSeverity.Trace)返回;
日志(`TRACE${propertyKey}.enter()`);
};
}
现在我有了一个组件来读取日志

@Component({
    templateUrl: 'applicationlogs.template.html'
})
export class ApplicationLogsPage implements OnInit {
    logs: string[];
    private subscription: Observable<string>;
    constructor(private navCtrl: NavController, private $loggerService: LoggerService) { }

    ngOnInit(){
        this.subscription = this.$loggerService.applicationLog$.subscribe((s) => {
            this.logs = s.split(/\r\n|\r|\n/g);
        });
    }
}
@组件({
templateUrl:'applicationlogs.template.html'
})
导出类ApplicationLogsPage实现OnInit{
日志:字符串[];
私人认购:可观察;
构造函数(私有navCtrl:NavController,私有$loggerService:loggerService){}
恩戈尼尼特(){
this.subscription=this.$loggerService.applicationLog$.subscription((s)=>{
this.logs=s.split(/\r\n |\r |\n/g);
});
}
}

你不能。您可以保存对根注入器的引用,类似于此。@estus,这总比什么都没有好。谢谢