angular - 我应该在注入(inject)的 Angular 服务上使用 readonly 而不是将它们公开吗?

标签 angular dependency-injection angular-services

我今天讨论了,我的一些同事说他们像这样注入(inject)他们的 Angular 服务:

constructor(readonly language: I18nService)

他们说他们这样做是因为它阻止了我的组件的使用者更改注入(inject)的服务,有点像这样:

@Component({ ... })
class ComponentA {
    constructor(public language: I18nService) {}
}

@Component({ ... })
class ComponentB {
    @ViewChild(ComponentA) compA: ComponentA;
    constructor() {
        this.compA.language = new I18nService();
    }
}

所以,虽然从技术上讲他们是对的,但我仍然不相信我应该那样做。我问自己以下问题:
  • DI 是 Angular 的基础部分。如果真的有人这样做了,这个人是最好跑到这个坑里失败还是完全做不到
  • readonly在这种情况下,对于开始学习 Angular 和 TypeScript 的人来说,理解起来可能非常复杂,原因有几个
  • Angular 在他们的任何官方 DI 文档中都没有使用这种方法
  • 您需要知道如何readonly工作,它只是保护我注入(inject)的服务的引用,但没有任何属性
  • 在我看来,这是一个极端案例问题,即使有一个简单的解决方案

  • 你怎么认为?有没有我可能没见过的官方引用资料?当我尝试在 google 上搜索 readonly 的用法时,我什么也没找到。在 Angular 概念中

    最后一句话:虽然 100% 正确 - 可以操纵 public service: Service 的引用- 我仍然不确定是否应该解决这个问题,并为是否要解决而苦恼。

    最佳答案

    这不是您必须做的事情,但制作它们是一种很好的做法 readonly因为您可能不想再次重新分配实例。

    Read-only properties may have initializers and may be assigned to in constructors within the same class declaration, but otherwise, assignments to read-only properties are disallowed.

    关于angular - 我应该在注入(inject)的 Angular 服务上使用 readonly 而不是将它们公开吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54871856/

    相关文章:

    ios - 如何使用 Swift 在 Typhoon 中通过协议(protocol)注入(inject)依赖?

    java - java 中抽象类属性重写导致 null

    javascript - 无法从 Angular 中的 Http 获取响应

    typescript - 如何从 angular2 的构造函数传递字符串参数或数字

    node.js - Electron/Angular2/打字应用程序 : Import module in a component

    angular - Angular 2 有徽章吗?

    java - 将 Spring 服务 bean 注入(inject) JSF ManagedBean 时出现 NullPointerException

    javascript - 使用服务进行数据绑定(bind)不适用于 Angular JS

    javascript - angularjs 在服务中包含另一个模块

    javascript - LAMP 堆栈中的 Angular 2