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

Posted

技术标签:

【中文标题】我应该在注入的 Angular 服务上使用只读而不是公开它们吗?【英文标题】:Should I use readonly on injected Angular services instead of making them public? 【发布时间】:2019-07-19 04:34:33 【问题描述】:

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

constructor(readonly language: I18nService)

他们说他们这样做是因为它会阻止我的组件的消费者更改注入的服务,有点像这样:

@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 是如何工作的,它只是保护我注入的服务的引用,但没有任何属性

    在我看来,这是一个极端情况问题,尽管有一个简单的解决方案

你怎么看?有没有我可能没见过的官方参考资料?当我尝试用谷歌搜索在 Angular 概念中使用 readonly 时,我没有找到任何东西

最后一句话:虽然它是 100% 正确的 - 可以操纵 public service: Service 的引用 - 我仍然不确定这是否应该完全解决,并且纠结是否要这样做。

【问题讨论】:

有可能因基于意见而被关闭,我建议您补充一下您正在寻找官方参考资料。我通常使用private: myService: MyService 来解决这个问题。 我第二个@WilliamLohan。我总是在构造函数中将服务定义为private 我找不到任何明确说明它的文档,但我假设所有 Angular 文档都注入私有 bc DI 为该组件单独提供服务,而其他任何东西都应该注入它自己的服务。也半相关***.com/questions/46596399/… 我通常将服务和其他注入项设为私有,以实现封装和高内聚。组件应该公开它工作所必需的东西。另请参阅***.com/q/3085285/1260204,这并不是真正特定于 Angular IMO。 我想 readonly 没有什么问题,只是让它 readlony 并不能解决上面代码的问题。如果ComponentBComponentA 得到I18nService,那么你正在破坏DI,并且ComponentB 变得紧密耦合,并且永远无法在没有ComponentA 的情况下进行单元测试 【参考方案1】:

你可以加private readonly service : ServiceClass

【讨论】:

【参考方案2】:

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

只读属性可以有初始化器,并且可以在同一个类声明中的构造函数中赋值,否则不允许对只读属性赋值。

【讨论】:

以上是关于我应该在注入的 Angular 服务上使用只读而不是公开它们吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用注入服务测试 Angular 1.6 组件?

如何使用构造函数上的异步调用注入服务,Angular 2

Angular依赖注入介绍

Angular 2 - 基类包含子类模板

Angular 2 @Injectable 似乎不起作用

Angular2开发笔记