2017-07-27 69 views
1

我已经定制服务类:使用DI传递参数到构造服务?

@Injectable() 

export class CustomService { 
    constructor(num: number) { 
    } 
} 

该类在组件的构造函数中注入这样的:

constructor(private cs: CustomService) { 
} 

但如何传递参数num在上述构造函数的服务? 类似的东西:

constructor(private cs: CustomService(1)) { 
} 

我知道的解决方案,我可以用织物图案,但有只有一个办法做到这一点?

+0

偏离主题,但您为什么要创建一个有状态的服务?服务应该是无状态的,应该对其客户一窍不通 – Dummy

+0

否则如何将参数(设置)传递给服务?服务必须与一些传入数据一起工作是不是? – Daniel

+0

你不能。考虑提供解​​释你的情况的例子。是的,它可能是工厂的变体。 – estus

回答

1

如果CustomService情况下,不应该是喷油单身,那就是:

class CustomServiceStorage { 
    private storage = new Map(); 

    constructor(@Inject(CustomService) private CustomService: typeof CustomService) {} 
    get(num) { 
    if (!this.storage.has(num)) 
     this.storage.set(num, new this.CustomService(num)); 

    return this.storage.get(num); 
    } 
} 

providers: [{ provide: CustomService, useValue: CustomService }] 

... 

private cs; 

constructor(@Inject(CustomService) private CustomService: typeof CustomService) { 
    this.cs = new CustomService(1); 
} 

如果CustomService应该被memoized换来相应的参数单身,实例应该通过额外的缓存服务中检索

+0

哪里写这个提供者:[{提供:CustomService,useValue:CustomService}]'?这是什么意思? – Daniel

+0

这取决于你的情况。在NgModule或Component中。请参阅[手册](https://angular.io/guide/dependency-injection#injector-providers)。 'useValue'表示CustomService将作为一个类注入,并且不会被注入器实例化。 – estus

+0

您可以检查使用相同配方的[答案](https://stackoverflow.com/a/44301253/3731501)。 – estus

0

服务可以保存数据。您可以在您的服务中定义一个公共属性并设置该数据。

下面是一个例子:

import { Injectable } from '@angular/core'; 

@Injectable() 
export class DataService { 
    serviceData: string; 
} 

但是,如果你配置的服务,乔恩对你的问题的评论可能是一个更好的解决方案。