

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 手动定义架构
<a name="ddb-mapper-code-schemas"></a>

****  
**DynamoDB Mapper 是开发者预览版。它功能不完整，可能会发生变化。**

## 在代码中定义架构
<a name="ddb-mapper-gs-manual-schema-def"></a>

为了最大限度地提高控制和可定制性，您可以在代码中手动定义和自定义架构。

如以下代码段所示，与使用注释驱动的架构创建相比，您需要在`build.gradle.kts`文件中包含更少的依赖关系。

（您可以导航到该*X.Y.Z*链接以查看可用的最新版本。）

```
// build.gradle.kts
val sdkVersion: String = [https://github.com/awslabs/aws-sdk-kotlin/releases/latest](https://github.com/awslabs/aws-sdk-kotlin/releases/latest) 

dependencies {
    implementation("aws.sdk.kotlin:dynamodb-mapper:$sdkVersion-beta") // For the Developer Preview, use the beta version of the latest SDK.
}
```

请注意，你不需要架构生成器插件，也不需要注解包。

Kotlin 类和 DynamoDB 项目之间的映射需要`[ItemSchema<T>](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/dynamodb-mapper/aws.sdk.kotlin.hll.dynamodbmapper.items/-item-schema/index.html)`一个实现，`T`其中是 Kotlin 类的类型。架构由以下元素组成：
+ 一个项目转换器，它定义了如何在 Kotlin 对象实例和 DynamoDB 项目之间进行转换。
+ 分区键规范，用于定义分区键属性的名称和类型。
+ （可选）排序键规范，用于定义排序键属性的名称和类型。

在下面的代码中，我们手动创建了一个`CarSchema`实例：

```
import aws.sdk.kotlin.hll.dynamodbmapper.items.ItemConverter
import aws.sdk.kotlin.hll.dynamodbmapper.items.ItemSchema
import aws.sdk.kotlin.hll.dynamodbmapper.model.itemOf

// We define a schema for this data class.
data class Car(val make: String, val model: String, val initialYear: Int)

// First, define an item converter.
val carConverter = object : ItemConverter<Car> {
    override fun convertTo(from: Car, onlyAttributes: Set<String>?): Item  = itemOf(
        "make" to AttributeValue.S(from.make),
        "model" to AttributeValue.S(from.model),
        "initialYear" to AttributeValue.N(from.initialYear.toString()),
    )

    override fun convertFrom(to: Item): Car = Car(
        make = to["make"]?.asSOrNull() ?: error("Invalid attribute `make`"),
        model = to["model"]?.asSOrNull() ?: error("Invalid attribute `model`"),
        initialYear = to["initialYear"]?.asNOrNull()?.toIntOrNull()
            ?: error("Invalid attribute `initialYear`"),
    )
}

// Next, define the specifications for the partition key and sort key.
val makeKey = KeySpec.String("make")
val modelKey = KeySpec.String("model")

// Finally, create the schema from the converter and key specifications.
// Note that the KeySpec for the partition key comes first in the ItemSchema constructor.
val CarSchema = ItemSchema(carConverter, makeKey, modelKey)
```

前面的代码创建了一个名为的转换器`carConverter`，该转换器被定义为的匿名实现`ItemConverter<Car>`。转换器的`convertTo`方法接受`Car`参数并返回一个表示 DynamoDB 项目属性的文字键和值的`Item`实例。转换器的`convertFrom`方法接受一个`Item`参数并从`Item`参数的属性值中返回一个`Car`实例。

接下来，代码创建了两个密钥规范：一个用于分区键，另一个用于排序键。每个 DynamoDB 表或索引都必须只有一个分区键，相应地，每个 DynamoDB 映射器架构定义也必须如此。架构也可能有一个排序键。

在最后一条语句中，该代码根据转换器和密钥规范为 `cars` DynamoDB 表创建架构。

生成的架构等同于我们在本节中生成的注释驱动架构。[使用类注释定义架构](ddb-mapper-get-started.md#ddb-mapper-gs-anno-schema-def)作为参考，以下是我们使用的带注释的类：

### 带有 DynamoDB Mapper 注释的汽车类别
<a name="ejd_mxz_ddc"></a>

```
@DynamoDbItem
data class Car(
    @DynamoDbPartitionKey
    val make: String,
    
    @DynamoDbSortKey
    val model: String,
    
    val initialYear: Int
)
```

除了自己实现之外`ItemConverter`，DynamoDB Mapper 还包括几个有用的实现，例如：
+ `[SimpleItemConverter](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/dynamodb-mapper/aws.sdk.kotlin.hll.dynamodbmapper.items/-simple-item-converter/index.html)`: 通过使用生成器类和属性描述符提供简单的转换逻辑。有关如何使用此[定义自定义项目转换器](ddb-mapper-anno-schema-gen.md#ddb-mapper-anno-schema-custom)实现方法的信息，请参阅中的示例。
+ `[HeterogeneousItemConverter](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/dynamodb-mapper/aws.sdk.kotlin.hll.dynamodbmapper.items/-heterogeneous-item-converter/index.html)`: 通过使用鉴别器属性提供多态类型转换逻辑，并为子类型委托`ItemConverter`实例。
+ `[DocumentConverter](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/dynamodb-mapper/aws.sdk.kotlin.hll.dynamodbmapper.items/-document-converter/index.html)`：为[https://docs.aws.amazon.com/smithy-kotlin/api/latest/runtime-core/aws.smithy.kotlin.runtime.content/-document.html](https://docs.aws.amazon.com/smithy-kotlin/api/latest/runtime-core/aws.smithy.kotlin.runtime.content/-document.html)对象中的非结构化数据提供转换逻辑。