为什么在Angular 2+中首选将共享变量放在服务中而不是将它们存储在可以直接导入的常量对象中?

问题描述 投票:0回答:2

我正在Angular 7中创建一个SPA,并希望遵循最佳实践,但我不完全理解为什么到处都建议在服务中存储数据而不是在具有可以直接导入的常量的文件中。

直接导入常量似乎更简单。我错过了重要的事吗?

我的代码:

userSession.ts

export const userSession = {
    loggedIn: null,
    userId: null
};

something.service.ts:

import { userSession } from '../appGlobals/user-session';
// decorators, ect .......
export class SomethingService {  
  constructor() { }
  doSomething() {
    if (userSession.loggedIn) {
      // do something
    }
  }
}

建议的代码(据我的理解):

user.service.ts

//imports and decorator ....
export class UserService {
  session = {
    loggedIn: boolean;
    userId: number;
  }
//...
}

some.service.ts

import { UserSession } from '../services/user.service.ts';
// decorators, ect .......
export class SomeService {
  constructor(private userService: UserService) { }
  doSomething() {
    if (this.userService.session.loggedIn) {
      // do something
    }
  }
}

对于使用用户会话字段的大型类,如果只使用“userSession”对象而不是“this.userService.session”并将依赖项注入构造函数,则代码似乎更清晰。那么每个设置的优点/缺点是什么?

angular security service global organization
2个回答
0
投票

在我看来,你所描述的例子没有区别,但是大多数情况下,当使用它们的组件被完全加载时,这些共享变量可能没有准备好,即变量可能在API调用之后被填充。出于这个原因,服务是首选,可以包含适当的功能,以适当和干净的方式操纵这些共享变量。还要记住,大多数这些共享变量是某些Observable对象,它们可以在值准备就绪时通知组件使用它们(即适用于之后填充值或可能发生更改的情况)。


0
投票

测试的一大优势。

在您的代码中,userSession在类之外声明,因此编写单元测试代码很困难。

但是在建议的中,服务是在构造函数中注入的,因此可以使用服务甚至模拟服务编写测试代码。

© www.soinside.com 2019 - 2024. All rights reserved.