TL;DR:AWS CDK的Construct
类的prepare(): void
方法的目的和功能是什么?我应该如何以及何时使用/避免它?
prepare()
上的文档显示:
protectedprepare((:void在合成前执行最终修改。
该方法可以通过派生构造来实现,以便在合成之前执行最终更改。prepare((将在准备好子构造之后调用。
这是一个高级框架功能。只有在您理解其含义的情况下才能使用此选项。
…但是那些";含义";无处可寻。
从我看到的几个AWS CDK项目(比如这个(来看,当构建AWS CDK结构和堆栈时,它们的所有内部结构(主要是子结构(都是在constructor()
函数中专门设置的(这将是一个典型的例子(。
我不认为这是一种使用类的好方法,但我很长一段时间以来都看不到另一种设置堆栈和构造的方法。然而,最近我偶然发现了prepare()
及其描述("…将在准备好子结构后调用"(。我猜,它应该是这样使用的:
export class SomeStack extends AWS.Stack {
prepare() {
// add constructs
// set permissions
// basically, do everything that is done in `constructor()` here: https://github.com/aws-samples/aws-cdk-examples/blob/master/typescript/api-cors-lambda-crud-dynamodb/index.ts
}
}
……但这与";执行最终修改";根据方法描述。
我从aws-cdk
的一个贡献者那里得到了答案。
正如他们所指出的,prepare()
已被弃用,而且无论如何都将被删除,因此使用它毫无意义:
我认为最重要的含义是,在执行该方法期间添加的构造本身不会是
prepare
d(因此,您不应该添加任何依赖于这种情况的构造(。
prepare
是一种最后的方法,用于构造在某些条件下渲染之前修复自己的状态(例如,如果未调用某些赋值函数方法,则渲染默认值(。
prepare()
已弃用,将在v2中删除。我不建议依赖它。
至于在构造函数中设置所有内容,建议将内部构造的定义视为给定父构造初始化的一部分:
我知道你可能对在构造函数中做很多工作有心理厌恶。试着看看构造定义,比如一组恰好产生初始化对象的声明(其中我们的Stack肯定有一个
Table
,编译器可以验证这个成员是否在构造函数中被赋值,这样我们就可以在程序的其余部分中依赖它(。