当前位置: 首页 > 知识库问答 >
问题:

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

韩阳飙
2023-03-14

我今天有一个讨论,我的一些同事说他们像这样注入他们的 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文档中都没有使用这种方法
    • 您需要知道只读的工作原理,并且它只是保护我注入的服务的引用,但没有保护任何属性

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

    你觉得呢?有没有我可能没见过的官方参考资料?当我试图在谷歌上搜索Angular概念中readone的用法时,我没有找到任何东西

    最后一句话:虽然这是100%正确的——操纵< code > public Service:Service 的引用是可能的——但我仍然不确定是否应该解决这个问题,也不知道是否应该这样做。

  • 共有2个答案

    潘泳
    2023-03-14

    您可以添加私有只读服务:ServiceClass

    夏侯俊美
    2023-03-14

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

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

     类似资料:
    • 我见过的大多数Angular教程都将HTTP服务注入到其他更专业的服务中。我计划创建一个专门的服务,并从HTTP服务继承。 然而,我担心可测试性,因为我认为,如果我注入它,我的专业服务将更容易测试。 我的问题是——从一般的角度来看,为了可测试性的目的,继承HTTP服务是明智的吗?

    • 问题内容: 如果我正在编写.NET代码,那么我经常会揭露任何可能有意义的地方。也许这取决于LINQ和您可以使用foreach的事实,但是这样做是“正确的”。 现在,我正在编写Java 8代码,并在辩论是否应该以相同的方式进行公开?也许是因为我必须打电话给我,感觉就像是在“工作”,但感觉不对吗? 是否应该以可能相同的方式在接口上公开? 问题答案: 您在问错问题。毕竟,同时支持这两者并不难,例如 因此

    • 如果我正在编写.NET代码,我通常会公开

    • 问题内容: 我正在编写一个将异步检索数据的服务($ http或$ resource)。我可以通过返回一个最初为空但最终将填充的数组来隐藏它是异步的事实: 或者我可以通过返回一个承诺来暴露异步性: (Plunker-如果有人想尝试上述两种实现。) 暴露异步性的一个潜在优势是,我可以通过向方法中添加错误处理程序来处理控制器中的错误。但是,我很可能会在应用程序范围的拦截器中捕获并处理$ http错误。

    • 我无法注销用户。注销适用于“机密”应用程序,但不适用于“只承载”应用程序(注销后其余服务仍可访问)。 我有以下配置: > 我在Keycloak中定义了一个“数据库”客户端应用程序,其访问类型为“只承载”(创建该应用程序的目的是公开受基于用户角色的Keycloak保护的REST web服务) 我在keycloak中定义了一个“rest_service”客户端应用程序,其访问类型为“机密”(创建该应用

    • 我有几个大的(100,000到10,000,000)向量的对象。我应该坚持这样的结构: 而不是: 我想重用包含这么多对象的向量,但我担心,当我调用clear()时,如果我将struct与std::string一起使用,我最终会得到1000000个析构函数调用。 这是使用std::string与char[]的常见问题吗?