我应该在注入的 Angular 服务上使用只读而不是公开它们吗?

kai*_*air 11 dependency-injection angular-services angular

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

constructor(readonly language: I18nService)
Run Code Online (Sandbox Code Playgroud)

他们说他们这样做是因为它可以防止我的组件的使用者更改注入的服务,有点像这样:

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

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

因此,虽然从技术上讲他们是对的,但我仍然不相信我应该这样做。我问自己以下问题:

  1. DI 是 Angular 的基本组成部分。如果有人真的这么做了,这个人是应该更好地进入这个坑并失败,还是他/她根本做不到?

  2. readonly在这种情况下,对于刚开始学习 Angular 和 TypeScript 的人来说,理解起来可能相当复杂,原因有几个

    • Angular 在其任何官方 DI 文档中均未使用此方法
    • 您需要知道它是如何readonly工作的,并且它只是保护我注入的服务的引用,但没有任何属性
  3. 在我看来,这是一个极端情况问题,尽管有一个简单的解决方案

你怎么认为?有没有我可能没见过的官方参考资料?readonly当我尝试在 Angular 概念中使用 google 时,我没有找到任何内容

最后一句话:虽然它是 100% 真实的 - 可以操纵参考public service: Service- 我仍然不确定这个问题是否应该得到解决,并且纠结是否要这样做。

Sas*_*iha 8

这不是您必须做的事情,但最好这样做,readonly因为您可能不想再次重新分配实例。

只读属性可以具有初始值设定项,并且可以在同一类声明内的构造函数中分配,但除此之外,不允许对只读属性进行分配。


小智 5

你可以加private readonly service : ServiceClass