Angular 创建提供者的命名实例
Angular creating named instances of providers
在 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有关)
根据@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
) {}
}
UserCache
和 ImageCache
现在是这些提供程序实例的标记。
在 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有关)
根据@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
) {}
}
UserCache
和 ImageCache
现在是这些提供程序实例的标记。