angular - 在依赖注入中使用只读
问题描述
我想知道当我在构造函数中注入一些东西时我们是否需要只读?例如 :
constructor(readonly private userService: UserService) { }
你能解释一下这种做法的用处(或没有用处)吗?
解决方案
简短:通常在 DI 中您不需要 readonly,因为您处理注入的服务并且类型安全保护您免于分配新值。
细节: 首先,如果你想使用private和readonly,那就是
private readonly userService: UserService
所以 readonly 出现在 private 之后。
然后注意 public/private/protected 和 readonly 之间的区别。
public/private/protected是关于可见性的。
- public:任何人都可以看到这个变量
- private:变量仅在您定义它的类内部可见
- protected:仅在内部类和派生类中可见(A 扩展 B)
另一方面,Readonly是关于您是否希望某人无法更改它。
简单的例子:
private amountOfPizzas = 1;
private readonly stomachSize = 2;
public eat(numberOfPizzas: number): void {
if(this.stomachSize < numberOfPizzas) {
this.stomachSize = numberOfPizzas; // will throw an error
}
this.amountOfPizzas = numberOfPizzas; // works
eat(); // ..
}
这也适用于 100% 的依赖注入。
当您以私有 userService: UserService的方式注入服务时,可以更改此变量。但是,由于 Typescript,它只能被分配一个新的 UserService 实例,所以无论你是否设置 readonly,它并没有太大的区别。
但是,假设您将注入另一个令牌,例如:
constructor(private numberOfPizzas: number) {}
那么它并不是一个真正被注入的服务,我想知道这是否真的有效。但是让我们假设它确实......或者出于任何原因,编译器没有找到错误,然后在类中我们可以为它分配一个新值。这很可能不是您真正想要的。坏的。
更危险的是,如果您使用公共可见性,那么当然会有更多的地方能够更改此变量 - 因此更难确定问题的来源。
推荐阅读
- java - 手机锁定时服务收不到广播消息
- xamarin - Xamarin MvvmCross MvxAppCompatDialogFragment 失去 BindingContext
- javascript - React Router 4 嵌套路由不在 Props 中
- javascript - 如何在不使用密钥的情况下将 json 转换为数组
- optimization - 优化 SQL Server 中的分页查询
- sql - PostgreSQL:在嵌套 CASE WHEN 中使用文本参数会显着减慢查询速度
- assembly - db 程序集中字符串的最大长度
- reactjs - 在 Reactjs 中单击外部 url 时如何重定向到不同的组件?
- laravel - 跳过数组验证规则的第一个索引?
- mysql - 获取 django.core.exceptions.ImproperlyConfigured:加载 MySQLdb 模块时出错,同时尝试执行第一次迁移