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这样的服务,希望有一个与new Cache('user');相对应的Cache。另一个名为 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 {}

(这与我的另一个问题有关(

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

相关内容

  • 没有找到相关文章

最新更新