2017-05-09 36 views
1

在Angular中,我有一项访问缓存的服务。该服务大致如此工作(但具有更多异步行为)。Angular创建提供者的命名实例

@Injectable() 
export class Cache { 

    cache : CacheTable; 

    constructor(
    protected name : string 
) { 
    this.cache = this.getTable(name); 
    } 

    put(id:string, data:any):void { this.cache.put(id, data); } 
    get(id:string):any { return this.cache.get(id); } 

    getTable(name : string) : CacheTable; 

} 

现在我有一些像UserService服务,希望能有一个Cache对应new Cache('user');的。命名ImageService另一项服务应与对应new Cache('image');

Cache实例对于这个工作,我想创建一个工厂来提供这些:

// file: custom-caches.ts 

import { Provider } from '@angular/core'; 
import { Cache } from '../cache/cache'; 

export let userCache : Provider = { 
    provide: Cache, 
    useFactory:() => new Cache('user') 
}; 

export let imageCache : Provider = { 
    provide: Cache, 
    useFactory:() => new Cache('image') 
}; 

我怎么会去注册和使用这些服务的?据我所知,他们都注册为'Cache'。

// file: my.module.ts 

@NgModule({ 
    providers: [userCache, imageCache] 
}) 
export class MyModule {} 

(这涉及到my other question

回答

0

如所建议的通过@ghetolay我用InjectionToken,并能成功地创建多个命名提供商factoried实例:

// file: custom-caches.ts 

import { Provider } from '@angular/core'; 
import { Cache } from '../cache/cache'; 

export const UserCache = new InjectionToken('userCache'); 

export let userCacheProvider : Provider = { 
    provide: UserCache, 
    useFactory:() => new Cache('user') 
}; 

export const ImageCache = new InjectionToken('imageCache'); 

export let imageCacheProvider : Provider = { 
    provide: ImageCache, 
    useFactory:() => new Cache('image') 
}; 

_

// file: my.module.ts 

@NgModule({ 
    providers: [userCacheProvider, imageCacheProvider] 
}) 
export class MyModule {} 

_

// file : UserService 

@Injectable() 
export class UserService { 
    constructor(
    @Inject(UserCache) private cache : Cache 
) {} 
} 

UserCacheImageCache现在令牌为这些供应商的情况。

相关问题