我有一个服务作为框架的核心,我们将被纳入许多项目。它使用当前静态的密钥将一些数据保存到本地存储。我想将密钥作为参数传入,因此它对于每个项目都是唯一的。这是因为当我从任何这些项目的localhost:4200
进行测试时,与本地存储字段/密钥存在冲突。我所拥有的是:
@Injectable()
export class MyService {
private static readonly STORAGE_ID = 'model-data';
constructor( ) {
}
someFunction() {
localStorage.setItem(MyService.STORAGE_ID, JSON.stringify(this._model))
}
}
如何向构造函数添加参数,以便仍然可以通过Angular 2依赖注入实例化它?
答案 0 :(得分:5)
您可以为密钥提供构造函数参数:
export const STORAGE_KEY = new InjectionToken<string>('storageKey');
@Injectable()
export class MyService {
constructor(@Inject(STORAGE_KEY) private storageKey: string) { }
...
}
然后在providers
中,你需要为它提供一个值:
providers: [
{ provide: STORAGE_KEY, useValue: 'this-app-key' },
MyService,
...
]
或者,创建工厂提供者功能:
export function createServiceFactory(storageKey: string) {
return () => new MyService(storageKey);
}
并使用:
{ provide: MyService, useFactory: createServiceFactory('that-app-key') }
这样您就不需要@Inject
参数。