2017-04-14 85 views
1

我有一个服务作为一个框架的核心,我们将其合并到许多项目中。它使用当前静态的密钥将一些数据保存到本地存储。我想让该键作为参数传入,以便它对每个项目都是唯一的。这是因为,当我在localhost:4200这些项目中进行测试时,与本地存储字段/密钥存在冲突。我所拥有的是:如何参数化Angular 2中的注入服务

@Injectable() 
export class MyService { 

private static readonly STORAGE_ID = 'model-data'; 

    constructor() { 

    } 

    someFunction() { 
     localStorage.setItem(MyService.STORAGE_ID, JSON.stringify(this._model)) 
    } 

} 

我怎样才能参数添加到构造所以它仍然可以通过角2依赖注入被实例化?

+2

如果你提供一个具体的代码示例,会更容易。只需添加一个构造函数参数并为其注册一些提供者。 –

+0

@GünterZöchbauer,“添加构造函数参数并为其注册一些提供者。”我不清楚这意味着什么。 – BBaysinger

+0

我想这至少和你的问题一样清晰;-)对于一个抽象的问题抽象的答案:p –

回答

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, 
    ... 
] 

给出一个例子in the DI documentation


或者,创建一个工厂提供的功能:

export function createServiceFactory(storageKey: string) { 
    return() => new MyService(storageKey); 
} 

和使用:

{ provide: MyService, useFactory: createServiceFactory('that-app-key') } 

这样你就不需要@Inject参数。

相关问题