我有一个在两种不同模式下工作的应用程序:演示和正常。演示模式仅在用户没有帐户并且只想尝试应用程序以查看其工作原理时使用。
现在假设我们有一个在应用程序中使用的服务。例如检索Account
和验证用户的服务:
abstract class AccountService {
authenticate(username: string, password: string): Observable<Boolean>;
getAccount(): Observable<Account>;
}
对于这个服务,我们有两种实现,每种模式一个。AccountServiceImpl
,对于普通模式,向某个服务器执行 HTTP 请求以检索帐户。而AccountServiceDemoImpl
只是返回一个硬编码的。
假设我们有一个AccountComponent
向用户显示帐户名称的组件。对于这个组件,我们使用哪个实现并不重要,所以我们只需AccountService
在它的构造函数中注入一个。
一切都很好,我们可以轻松地使用任一实现来填写 AccountComponent。现在,当用户单击登录页面上的按钮时,我们希望能够在运行时在这些实现之间切换。所以我写了一个工厂提供者来确定使用哪个 AccountService 实现
{provide: AccountService, deps[AccountServiceImpl, AccountServiceDemoImpl], (regularService, demoService) => demoModeActivated ? demoService : regularService}
可以想象,AccountService
在登录页面上也注入了 来处理用户的认证。这意味着该工厂已经过评估。现在,问题是这个评估的结果被缓存在 Angular 中。因此,当激活演示模式并且用户导航到 时AccountComponent
,实际AccountServiceImpl
将再次注入。
有没有办法清除 DI 缓存(对于一组特定的 DI 令牌)?还是我应该尝试以其他方式处理此功能?(例如,编写AccountService
委托给AccountServiceImpl
或 的另一个实现AccountServiceDemoImpl
。)