Angular创建提供者的命名实例

时间:2017-05-09 13:15:24

标签: angular factory angular-providers angular-factory

在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,希望Cachenew Cache('user');对应。名为ImageService的另一项服务应与Cache对应的new Cache('image');实例一起使用

为此,我想创建一个工厂来提供这些:

// 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

有关

1 个答案:

答案 0 :(得分:0)

根据@ghetolay的建议,我使用了InjectionToken,并且能够成功创建多个命名提供者作为因子实例:

// 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现在是这些提供程序实例的令牌。