如何将 aws-cdk typescript stack class 构造函数中的定义提取到单独的文件中?

How to extract definitions inside aws-cdk typescript stack class constructor function into separate files?

使用 aws-cdk 进行试验,很容易看出 stack/backend 构造 class 文件会变得非常大。在这个 cdk Stack class 示例中(从 aws-cdk api-cors-lambda-crud-dynamodb 示例复制和修剪)是否有一种惯用的方法来提取 dynamodb、lambda 和 api网关构造函数定义出栈class 构造函数放到单独的文件中?它们都以 this 作为第一个参数。我想要一个单独的文件用于所有 lambda def,一个用于 db def,api 网关配置等,它们仍然在主堆栈 class 中引用。有没有一种方法可以做到这一点而不必为每个定义创建新的 classes?

export class ApiLambdaCrudDynamoDBStack extends cdk.Stack {
    constructor(app: cdk.App, id: string) {
        super(app, id);

        const dynamoTable = new dynamodb.Table(this, "items", {
            partitionKey: {
                name: "itemId",
                type: dynamodb.AttributeType.STRING
            },
            tableName: "items"
        });

        const getOneLambda = new lambda.Function(this, "getOneItemFunction", {
            code: new lambda.AssetCode("src"),
            handler: "get-one.handler",
            runtime: lambda.Runtime.NODEJS_10_X,
            environment: {
                TABLE_NAME: dynamoTable.tableName,
                PRIMARY_KEY: "itemId"
            }
        });

        const getAllLambda = new lambda.Function(this, "getAllItemsFunction", {
            code: new lambda.AssetCode("src"),
            handler: "get-all.handler",
            runtime: lambda.Runtime.NODEJS_10_X,
            environment: {
                TABLE_NAME: dynamoTable.tableName,
                PRIMARY_KEY: "itemId"
            }
        });

        dynamoTable.grantReadWriteData(getAllLambda);
        dynamoTable.grantReadWriteData(getOneLambda);

        const api = new apigateway.RestApi(this, "itemsApi", {
            restApiName: "Items Service"
        });

        const items = api.root.addResource("items");
        const getAllIntegration = new apigateway.LambdaIntegration(getAllLambda);
        items.addMethod("GET", getAllIntegration);

        const singleItem = items.addResource("{id}");
        const getOneIntegration = new apigateway.LambdaIntegration(getOneLambda);
        singleItem.addMethod("GET", getOneIntegration);
    }
}

是的,您可以将它们分成各自的堆栈。 'LambdaStack'、'DynamoDbStack' 等

或者如果您不想直接在构造函数中使用它,您可以单独使用 'helper' 类。这是一个简单的 C# 示例:

public class ApiLambdaCrudDynamoDbStack : Stack 
{
    internal ApiLambdaCrudDynamoDbStack(Construct scope, string id) : base (scope, id)
    {
        var helper = new MyHelper();
        
        helper.CreateTable(this, "My-Cool-Table"); 
        
    }
}

public class MyHelper
{
    public void CreateTable(Construct scope, string tableName)
    {
        var table = new Table(scope, "My-Table", new TableProps()
        {
             TableName = tableName
        });
    }
}