AWS CDK 构造"prepare"方法的目的?



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()已被弃用,而且无论如何都将被删除,因此使用它毫无意义:

我认为最重要的含义是,在执行该方法期间添加的构造本身不会是prepared(因此,您不应该添加任何依赖于这种情况的构造(。

prepare是一种最后的方法,用于构造在某些条件下渲染之前修复自己的状态(例如,如果未调用某些赋值函数方法,则渲染默认值(。

prepare()已弃用,将在v2中删除。我不建议依赖它。

至于在构造函数中设置所有内容,建议将内部构造的定义视为给定父构造初始化的一部分:

我知道你可能对在构造函数中做很多工作有心理厌恶。试着看看构造定义,比如一组恰好产生初始化对象的声明(其中我们的Stack肯定有一个Table,编译器可以验证这个成员是否在构造函数中被赋值,这样我们就可以在程序的其余部分中依赖它(。

最新更新