繁体   English   中英

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

[英]Why in Angular 2+ is it preferred to put shared variables in services rather than store them in a constant object that can be imported directly?

我正在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”并将依赖项注入到构造函数中,则代码看起来更简洁。 那么每种设置的优点/缺点是什么?

在我看来,您所描述的示例没有什么区别,但是在大多数情况下,当使用它们的组件完全加载时,可能无法准备这些共享变量,即,在API调用之后可能会填充该变量。 因此,首选的服务应具有适当的功能,以适当且干净的方式操纵这些共享变量。 还请记住,这些共享变量中的大多数都是某种Observable对象,它们可以在值准备好时通知使用它们的组件(即适用于事后填充值或会发生更改的情况)。

测试的一大优点是。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM