我正在尝试在角度2上连接DI。我基本上拥有我所有的服务,我期望在我的app.module.ts中的providers数组中成为单例。
providers: [
{ provide: ErrorHandler, useClass: IonicErrorHandler },
{ provide: 'ICommentService', useClass: CommentService },
{ provide: 'IPostService', useClass: PostService },
{ provide: 'IQueryParamsService', useClass: QueryParamsService },
{ provide: 'IUserService', useClass: UserService },
{ provide: 'IInjectorService', useClass: InjectorService},
{ provide: 'IPostFactory', useClass: PostFactory}
]
我还希望有一个ReflectiveInjector来负责创建我需要的对象实例。我这样创建了它:
this.injector = ReflectiveInjector.resolveAndCreate([
{ provide: 'IComment', useClass: Comment },
{ provide: 'ICommentList', useClass: CommentList },
{ provide: 'IPic', useClass: Pic },
{ provide: 'IPost', useClass: Post },
{ provide: 'IUser', useClass: User }
]);
我的问题是,例如Post需要一个PostService,当我要求这个注入器发布时它出错了,因为它无法找到PostService,这是有意义的,因为它是独立的注入树。 / p>
我问这样的注射器:
this.injector.get('IPost');
这是我的Post课程的一部分:
@Injectable()
export class Post extends DBObject implements IPost{
private title: string;
private body:string;
//private comments:ICommentList;
//private img:IPic;
//private author:IUser;
private authorId: number;
private date:Date;
constructor(
@Inject('IPostService') private PostService:IPostService,
@Inject('IUserService') private UserService:IUserService,
@Inject('IUser') private author:IUser,
@Inject('IPic') private img: IPic,
@Inject('ICommentList') private comments:ICommentList
){
super();
}
我省略了无关的功能。我希望IPostService,IUserService是模块中声明的单例,但IUser,IPic和ICommentList每次都应该是新实例。
错误是:
Error in ./TabsPage class TabsPage - caused by: No provider for IPostService! (IPost -> IPostService)
我该如何做到这一点?
谢谢!
PS:这是一个有角度的问题,但是如果重要的话,我会使用Ionic。
答案 0 :(得分:2)
你可能想要
constructor(injector:Injector) {
resolvedProviders = ReflectiveInjector.resolve([
{ provide: 'IComment', useClass: Comment },
{ provide: 'ICommentList', useClass: CommentList },
{ provide: 'IPic', useClass: Pic },
{ provide: 'IPost', useClass: Post },
{ provide: 'IUser', useClass: User }
]);
let this.injector = ReflectiveInjector.fromResolvedProviders(resolvedProviders, injector);
多次调用
this.injector.get('IPost');
会为您提供相同的Post
实例。
Angular2 DI为每个提供商维护一个实例。如果您想为每个呼叫获取不同的实例,您可以提供工厂,从DI获取此工厂并致电工厂以获取新实例。如果您需要有关此方法的更多详细信息,请发表评论。
另见