Angular 2 Dependency Injection单例/新实例

时间:2016-12-17 18:41:34

标签: angular dependency-injection ionic2

我正在尝试在角度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。

1 个答案:

答案 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获取此工厂并致电工厂以获取新实例。如果您需要有关此方法的更多详细信息,请发表评论。

另见