---
title: "OData準拠"
slug: "odata-compliance"
abstract: "OData準拠の概要。"
---
# OData準拠

> !注Sitecore Experience Commerce(XC)リリース10.0以降はMicrosoftをベースにしています。AspNetCore.Odataバージョン7.3.1。

Commerce Service APIは[Open Data Protocol(OData)](https://www.odata.org/)に基づいています。ODataは、外部システムがCommerceの機能やデータ構造を発見できるメタデータを提供します。ODataはまた、メタデータに対する注釈もサポートしており、これにより基本的な検証要件や列挙が可能で、より賢いクライアントが列挙可能なプロパティを事前検証しドロップダウンでサポートできるようにします。

ほとんどのMicrosoft製品はODataをネイティブに利用可能です。例えば、ExcelはODataソースに接続でき、Power Pivotやその他のExcelベースの分析ツールを簡単に統合できます。Microsoft Dynamics AXを含む他のMicrosoft製品もサービス層でODataをサポートしています。

## コントローラー

Sitecore XCコントローラはODataControllerクラスから継承します。基底クラスはCommerceODataControllerであり、以下の例で示されています。

...
Authorize(Policy = "RoleRequirement")
public class ComerceODataController : ODataController, IActionFilter, IAzynActionFilter, IDisposable

## ODataルート

ODataRouteはODataRoute属性とODataRoutePrefix属性を使用します。

### ODataRoute属性

ODataRoute属性はコントローラーの操作を定義します。例えば:

HttpGet
ODataRoute
EnableQuery(MaxExpansionDepth = 0)
public async Task<IEnumerable<CommerceEnvironment>> Get()

HttpGet
EnableQuery(MaxExpansionDepth = 0)
ODataRoute("({Id})
public async Task<IActionResult> Get(FromODataUri string id)

> !注RouteNameを指定しない場合、このアクションはCommerceAPIとCommerceOpsの両方のルートで利用可能です。

> !注拡張フィルターが2レベル以上使われるGETアクションには、EnableQuery属性にMaxExpansionDepth = 0を使うことを推奨します。

#### コントローラーアクション用のODataRoute属性例

以下の行動はCommerceOpsルート*でのみ*可能です。

HttpPost
ODataRoute("RunMinion", RouteName = CoreConstants.CommercepsApi)
public <IActionResult RunMinion(FromBody ODataActionParameters value)

以下の行動はCommerceAPIルート*でのみ*可能です。

HttpGet
ODataRoute("GetListMetadata(listName={listName})", RouteName = CoreConstants.CommerceAPI)
public async Task<IActionResult> GetListMetadata(FromODataUri string listName)

以下の操作はルートを指定しておらず、そのためCommerceAPIルートとCommerceOpsルートの両方で利用可能です。

HttpPost
ODataRoute("AddPolicy")
public async Task<IactionResult> AddPolicy(FromBody ODataActionParameters value)

### ODataRoutePrefixの属性

エンティティODataコントローラの場合、ODataRoutePrefix属性はそのコントローラのすべてのアクションに使用されるプレフィックスを指定します。 ODataRoutePrefix属性値はエンティティ集合の名前と一致しなければなりません。

以下の例では、ODataRoutePrefixは次のように定義されたエンティティ集合に基づいてarg.EntitySet<CommerceEnvironment>("Environments"):

...
ODataRoutePrefx("Environments")
public class EnvironmentsController : CommerceOdataController

## ODataモデルビルダー

このODataConventionModelBuilder(https://docs.microsoft.com/en-us/odata/webapi/convention-model-builder) は厳密なディスカバリー機構を使用しています。ディスカバリーメカニズムがより厳格であるため、[クラスをIEdmModel](https://docs.microsoft.com/en-us/dotnet/api/microsoft.odata.edm.iedmmodel?view=odata-edm-7.0)に追加しなければなりません。

XCはIEdmModelを構築するために以下のパイプラインを使用します:

-   IConfigureServiceApiPipeline
-   IConfigureOpsServiceApiPipeline

派生クラスの発見を促進するために、ODataConventionModelBuilderの以下の拡張機能を使用できます:

-   AddCommerceComplexType: この拡張機能はCLRクラスとそのすべての派生クラスをComplexTypesとしてマッピングします。この操作はCommerceAPIルートとCommerceOpsルートの両方で利用可能です。
    
    例えば:
    
    arg.AddCommerceCompletexType(typeof(Model));
    arg.AddCommerceCompletexType(typeof(Policy));
    arg.AddCompletexType(typeof(CommandMessage));
    arg.AddCompletexType(typeof(EntityReference));
    arg.AddCompletexType(typeof(Dictionary<string, string>));
    arg.AddCompletexType(typeof(List<Task<CommerceCommand>>));
    arg.AddCompletexType(typeof(ConcurrentDictionary<string, string>));
    
-   AddCommerceEntity: この拡張はCLRクラスを写像し、その派生クラスをエンティティとしてallします。例えば:
    
    arg.AddCommerceEntity(typeof(CommerceEntity));
    arg.AddCommerceEntity(typeof(Component));