

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

# 属性引用
<a name="schemas_attributereferences"></a>

Amazon Cloud Directory 分面包含属性。属性可以是属性定义或属性引用。属性定义是声明其名称和基元类型 (字符串、二进制、布尔值、日期时间或数字) 的属性。它们还可以选择性地声明必需行为、默认值、不可变标志和属性规则 (如最小/最大长度)。

属性引用是从其他预先存在的属性定义派生其基元类型、默认值、不可变标志和属性规则的属性。属性 (attribute) 引用没有自己的基元类型、默认值、不可变标志或规则，因为这些属性 (property) 来自目标属性 (attribute) 定义。

属性引用可以覆盖目标定义的必需行为 (这方面的更多详细信息请参阅下文)。

创建属性引用时，只需提供属性名称和目标属性定义 (其中包括目标属性定义的分面名称和属性名称)。属性引用不能引用其他属性引用。此外，属性引用当前不能以不同架构中的属性定义为目标。

如果对象的两个或更多属性需要引用相同的存储位置，可以使用属性引用。例如，假设一个对象应用了 User 分面和 EnterpriseUser 分面。User 分面具有 FirstName 属性定义，而 EnterpriseUser 分面具有指向 User.FirstName 的属性引用。两个 FirstName 属性都引用对象上的相同存储位置，因此对 User.FirstName 或 EnterpriseUser.FirstName 进行的任何更改都具有相同效果。

## API 示例
<a name="schemas_referenceapiexample"></a>

以下示例演示如何通过 Cloud Directory API 使用属性引用。在此示例中，基本分面包含属性定义，另一个分面包含引用基本分面中的属性的属性。请注意，引用属性可以标记为 Required，而基本分面为 Not Required。

```
    // create base facet
    CreateFacetRequest req1 = new CreateFacetRequest()
      .withSchemaArn(devSchemaArn)
      .withName("baseFacet")
      .withAttributes(List(
        new FacetAttribute()
          .withName("baseAttr")
          .withRequiredBehavior(RequiredAttributeBehavior.NOT_REQUIRED)
          .withAttributeDefinition(new FacetAttributeDefinition().withType(FacetAttributeType.STRING))))
      .withObjectType(ObjectType.DIRECTORY)
    cloudDirectoryClient.createFacet(req1)

    // create another facet that refers to the base facet
    CreateFacetRequest req2 = new CreateFacetRequest()
      .withSchemaArn(devSchemaArn)
      .withName("facetA")
      .withAttributes(List(
        new FacetAttribute()
          .withName("ref")
          .withRequiredBehavior(RequiredAttributeBehavior.REQUIRED_ALWAYS)
          .withAttributeReference(new FacetAttributeReference()
            .withTargetFacetName("baseFacet")
            .withTargetAttributeName("baseAttr"))))
      .withObjectType(ObjectType.DIRECTORY)
    cloudDirectoryClient.createFacet(req2)
```

## JSON 示例:
<a name="schemas_referencejsonexample"></a>

以下示例演示如何在 JSON 模型中使用属性引用。此模型表示的架构与上面的模型相同。

```
 {
  "facets" : {
    "baseFacet" : {
      "facetAttributes" : {
        "baseAttr" : {
          "attributeDefinition" : {
            "attributeType" : "STRING"
          },
          "requiredBehavior" : "NOT_REQUIRED"
        }
      },
      "objectType" : "DIRECTORY"
    },
    "facetA" : {
      "facetAttributes" : {
        "ref" : {
          "attributeReference" : {
            "targetFacetName" : "baseFacet",
            "targetAttributeName" : "baseAttr"
          },
          "requiredBehavior" : "REQUIRED_ALWAYS"
        }
      },
      " objectType" : "DIRECTORY"
    }
}
```

### 属性引用注意事项
<a name="schemas_attributerefconsiderations"></a>

属性引用必须以相同架构中预先存在的属性定义为目标。
+ 属性引用可以将相同分面或不同分面中预先存在的属性定义作为目标。
+ 属性引用不能以其他属性引用为目标。
+ 删除所有引用之前，无法删除包含的属性定义是其他分面的属性引用目标的分面。

可以通过创建对象或向现有对象应用分面，采用与使用传统属性定义相同的方式来使用属性引用。

**注意**  
可以应用引用了其他分面的分面，但是无需直接应用目标分面。未应用目标分面时，不会对属性引用的行为进行更改。(仅当希望目标分面上的其他属性在对象上存在时，才需要应用该分面。)

### 设置属性引用值
<a name="schemas_settingattributerefvalues"></a>

要更改属性的值时，您可以调用 [UpdateObjectAttributes](https://docs.aws.amazon.com/clouddirectory/latest/APIReference/API_UpdateObjectAttributes.html) API 操作。更新 (或删除) 对象上的定义或任何引用了该定义的其他引用具有相同效果。

### 获取属性引用值
<a name="schemas_gettingattributerefvalues"></a>

您可以调用 [ListObjectAttributes](https://docs.aws.amazon.com/clouddirectory/latest/APIReference/API_ListObjectAttributes.html) API 操作来检索存储别名。此调用返回元组的列表，其中每个元组都包含一个属性键及其关联值。属性键对应于对象上存在的存储别名的列表。

**注意**  
可以为未显式应用于对象的分面返回属性键。当属性引用以未应用于对象的分面为目标时，可能发生这种情况。

例如，假设有 User 分面和 EnterpriseUser 分面。EnterpriseUser.FirstName 属性引用 User.FirstName。然后将 User 和 EnterpriseUser 分面都应用于一个对象，将 User.FirstName 设置为 Robert，然后将 EnterpriseUser.FirstName 设置为 Bob。调用 ListObjectAttributes 时，只会看到“User.FirstName = Bob”，因为两个 FirstName 属性只有一个存储别名。

### 将索引与属性引用结合使用
<a name="schemas_usingindexeswithattributeref"></a>

只能使用属性定义 (而不是引用) 创建索引。列出索引不会为属性引用返回属性键。但是，它会为作为索引对象上存在的引用的目标的任何属性定义返回属性键。换句话说，在索引层，仅将属性引用视为属性的备选标识符 (在运行时解析为正确的属性定义标识符)。

例如，假设分面 User 属性 FirstName 具有索引。您附加一个只应用了 EnterpriseUser 分面的对象。随后将该对象的 EnterpriseUser.FirstName 属性值设置为 Bob。最后调用 ListIndex 操作。结果仅包含“User.FirstName = Bob”。

### 属性引用的必需行为
<a name="schemas_requiredbehaviorattributeref"></a>

属性引用可以具有与其目标属性定义不同的必需行为。因此，可以是基本定义可选，而对该定义的引用是必需的。如果对象有一个基本定义以及一个或多个对该基本定义的引用，基本定义和所有引用都必须遵循所有相关属性间存在的最强必需行为。
+ 与属性定义一样，在创建对象或向现有对象添加分面时，必须为任何必需属性定义提供值。
+ 为方便起见，如果对象的多个属性引用相同存储位置时，您只需为该存储位置的属性之一提供值。
+ 同样，如果为相同存储位置提供多个值，则这些值必须相等。