main.js Aurelia 中 setRoot 的依赖注入(用于 HttpFetch)

Dependency Injection (for HttpFetch) at setRoot in main.js Aurelia

我无法让依赖注入为我的 AuthorizerService 工作。显然,dep-inj 直到 Aurelia "starts" 之后才准备就绪,但我不确定如何访问它。

main.js:

  aurelia.container.registerInstance(HttpClient, http.c());
  // set your interceptors to take cookie data and put into header
  return aurelia.start().then(() => {
    let Authorizer = new AuthorizerService();
    aurelia.container.registerInstance(AuthorizerService, Authorization);
    console.log('Current State: %o', Authorizer.auth);
    Authorizer.checkCookieAndPingServer().then(() => { console.log('Current State: %o', Authorizer.auth); aurelia.setRoot(PLATFORM.moduleName('app'));  }, () => { aurelia.setRoot(PLATFORM.moduleName('login-redirect')); });
  });

现在的问题是,如果我这样做 "new AuthorizerService()",那么 "this.http.fetch()" 在 AuthorizerService.js 中不可用。

我是不是要将 "http.c()"(它提供 HttpClient 实例)作为内部参数传递:

checkCookieAndPingServer(http.c())

或者有其他方法吗?

我可以删除 "new AuthorizerService()" 然后就这样做吗(我编的):

aurelia.container.getInstance(AuthorizerService); 

以某种方式强制它进行依赖注入并检索 "http.c()" 的 "registered Instance"?

我不能只检查 cookie。为了安全起见,我必须 ping 服务器,服务器将设置 cookie。

我认为这完全是错误的,因为我需要一个默认为 false 的全局参数,然后它会查询后端服务器并相应地设置 Root。也许只在 "login page" 查询后端?好的,但是我需要在登录模块中执行 "setRoot(backtoApp); aurelia.AlsoSetLoggedIn(true);" 。但是当我 setRoot(backtoApp) 然后它又重新开始了。

也就是说,当setRoot(login);然后 setRoot(backToApp); <-- 那么 AuthorizerService 实例没有其正确的数据集(例如 loggedIn=true)。

编辑:更好的解决方案可能是:

main.js:

return aurelia.start().then(() => {
        let Authorizer = aurelia.container.get(AuthorizerService);
        let root = Authorizer.isAuthenticated() ? PLATFORM.moduleName('app') : PLATFORM.moduleName('login');
        console.log('Current State: %o', Authorizer.auth);
        aurelia.setRoot(root);
      });

Authorizer.js

constructor(http) {
    this.http = http;
    this.auth = {
      isAuthenticated: false,
      user: {}
    }
  }

"this.auth" 不再是静态的。不再 "static auth = { isAuthenticated: false }" 这是我找到的一些示例代码。

所以现在 "auth" 设置在 "login" 模块中。但这意味着每次应用程序短暂加载时都会显示 "login" 模块,然后再重定向回 "setRoot(backToApp)"

如果你要获取的class实例是纯粹基于classes的服务,对某些Aurelia插件没有依赖,则不需要等到Aurelia已经启动安全调用容器。

以你的例子为例: aurelia.container.getInstance(AuthorizerService); 有可能 aurelia.container.get(AuthorizerService);

并且您不应该使用 new AuthorizerService(),正如您在问题中注意到的那样。