Angular 2:我可以定义每次需要它时调用的工厂提供程序吗?

时间:2017-03-15 15:32:12

标签: angular dependency-injection

假设我的应用程序具有经过身份验证的用户的概念,该用户由UserService管理。虽然经过身份验证的用户可以在应用程序的整个生命周期中进行更改(例如登录/注销),但我的大多数组件只关心当前用户在创建时的身份,并且此值永远不会改变该组件存在。对于这些情况,我正在寻找最简洁的方式来注入当前用户。

我想做的是能够将用户注入到组件中而没有UserService的间接层。也就是说,而不是:

class FooComponent {
  private user: User;

  constructor(userService: UserService) {
    this.user = userService.get();
  }
}

我喜欢做像

这样的事情
class FooComponent {
  constructor(private user: User) {}
}

我尝试使用factory providers通过包含类似于以下内容的代码段(在app.module.ts中)实现此功能:

{
  provide: User,
  useFactory: (userService: UserService) => userService.get(),
  deps: [UserService]
}

这很好用,但我注意到工厂函数只在第一次需要用户注入时调用,并且结果会被记忆以备将来使用。 memoization意味着任何试图注入当前用户的组件将始终获得返回的第一个值,这意味着如果您注销然后以其他用户身份返回,则会得到错误的答案。是否可以禁用该记忆?

在一个角度1应用程序中,我使用路由器中的resolve机制做了类似的事情,但是同样的机制在角度2中更加冗长,使得它比注入{更简洁和复杂的方法{1}}。

0 个答案:

没有答案