---
title: "Commerce Engineプラグインの要素"
slug: "elements-of-a-commerce-engine-plugin"
abstract: "Commerceのマイクロサービスプラグインが貢献する主要なオブジェクトクラスの概要。"
---
# Commerce Engineプラグインの要素

Commerce Coreインフラストラクチャは、Commerceプラグインを構成するさまざまなコアクラスを定義しています。

このトピックでは、Commerceマイクロサービスプラグインが一般的に貢献する主要なオブジェクトクラスのいくつかを紹介します(Commerce [Coreの概要](https://doc.sitecore.com/xp/ja/developers/102/sitecore-experience-commerce/commerce-core-overview.html "Commerce Core overview") トピックでは、Commerceのコアオブジェクトや概念のより包括的なリストが提供されています)。

> !注[Commerce.Engine.SDK](https://doc.sitecore.com/xp/ja/developers/102/sitecore-experience-commerce/sitecore-commerce-engine-sdk.html "Sitecore Commerce Engine SDK")にパッケージされたVisual Studio拡張をインストールすると、Sitecore.Commerce.Plugin.Sampleプロジェクトテンプレートはこれらの一般的なクラスのほとんどのサンプルを提供します。

## エンティティ

コマースプラグインはエンティティを貢献することができます。コマースエンティティはコアCommerceEntity(commerce-entity.md "Commerce entity")クラスに基づいており、eコマースに内在する重要なビジネスコンセプトを直接表現するよう設計されています。例えば、Sitecore.Commerce.Plugin.OrdersプラグインはOrdersエンティティとSalesActivityエンティティを貢献し、Sitecore.Commerce.Plugin.Cartsプラグインはcartsエンティティを貢献する、という具合です。

エンティティクラスは永続的ストレージに単一のユニットとして格納されます。カスタム定義エンティティを格納するためにデータベーススキーマを管理する必要はありません。

Commerce Entityには一意の識別子があり、Service APIを使って取得できます。

## 構成要素

Commerce Coreは、[構成の拡張性](https://doc.sitecore.com/xp/ja/developers/102/sitecore-experience-commerce/compositional-extensibility.html "Compositional extensibility")を可能にする基本的な構造であるコンポーネントクラスを定義しています。Commerceプラグインは、Commerceエンティティを拡張する手段としてコンポーネントを貢献できます。例えば、可用性プラグインSitecore.Commerce.Plugin.AvailabilitySellableItemエンティティを拡張するitemAvailabilityComponentを提供し、これはSitecore.Commerce.Plugin.Catalogの一部です。通常、コンポーネントをパイプラインにフックすることでエンティティに関連付けます。

以下はitemAvailabilityComponentの例を示しています:

namespace Sitecore.Commerce.Plugin.Availability
{
 using System;
 using Sitecore.Commerce.Core;
 /// <summary>
 /// The item availability component.
 /// </summary>
 public class ItemAvailabilityComponent : Component
 {
 /// <summary>
 /// Gets or sets the item identifier.
 /// </summary>
 /// <value>
 /// The item identifier.
 /// </value>
 public string ItemId { get; set; }
 /// <summary>
 /// Gets or sets the available quantity.
 /// </summary>
 /// <value>
 /// The available quantity.
 /// </value>
 public decimal AvailableQuantity { get; set; }
 /// <summary>
 /// Gets or sets the available date.
 /// </summary>
 /// <value>
 /// The available date.
 /// </value>
 public DateTimeOffset AvailableDate { get; set; }
 /// <summary>
 /// Gets or sets a value indicating whether this instance is available.
 /// </summary>
 /// <value>
 /// <c>true</c> if this instance is available; otherwise, <c>false</c>.
 /// </value>
 public bool IsAvailable { get; set; }
 /// <summary>
 /// Gets or sets the availability expires.
 /// </summary>
 /// <value>
 /// The availability expires.
 /// </value>
 public DateTimeOffset AvailabilityExpires { get; set; }
 }
}
## モデル

コマースプラグインはモデルを貢献できます。モデルはエンティティやコンポーネント内で再利用可能な[POCO](https://en.wikipedia.org/wiki/Plain_old_CLR_object)クラスです。モデルを使って、コマンドレスポンスやAPIリクエストレスポンスの一部として返されるデータを形成・提示できます。

以下はCreateOrderモデルクラスの例を示しています:

namespace Sitecore.Commerce.Plugin.Orders
{ using Sitecore.Commerce.Core;
 /// <summary>
 /// Defines the created order model.
 /// </summary>
 /// <seealso cref="Sitecore.Commerce.Core.Model" />
 public class CreatedOrder : Model
 {
 /// <summary>
 /// Initializes a new instance of the <see cref="CreatedOrder"/> class.
 /// </summary>
 public CreatedOrder()
 {
 this.OrderId = string.Empty;
 }
 /// <summary>
 /// Gets or sets the order identifier.
 /// </summary>
 /// <value>
 /// The order identifier.
 /// </value>
 public string OrderId { get; set; }
 }
}

## コントローラー

コントローラはプラグイン内でコマンドとして実装されたCommerceの機能を公開します。例えば、カスタムコマンドを定義し、そのコマンドをREST APIで公開したい場合、カスタムコントローラアクションを定義しなければなりません。コントローラクラスはODATA準拠で、標準的な[ASP.NET Coreモデル・ビュー・コントローラ(MVC)](https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-mvc-app/adding-controller?view=aspnetcore-2.2&tabs=visual-studio) パターンに基づいています。

## コマンド

プラグインはコマンドを定義し、Sitecore XCの外向きのAPIのように機能します。コマンドクラスは、呼び出し時にアクションを実行したりイベントをトリガーしたりするために必要なすべての情報を定義しカプセル化します。

コマンドはまた、Commerce Engine内部で他のパイプラインを実行したり、他のアクションを実行したりするアクションをトリガーすることもできます。例えば、コントローラーを使って販売可能なアイテムを取得する呼び出しはGetSellableItemCommandを呼び出し、GetSellableItemパイプラインを実行します。

## パイプライン

Commerce Coreは拡張性をサポートするパイプラインフレームワークを定義しています。Commerceプラグインでは、パイプラインはビジネスロジックのコンテナとして機能します。パイプラインクラス自体は通常軽量で、主にパイプライン自体の定義を表現します。例えば、以下はOrdersプラグインによって定義されたICreateOrderPipelineクラスを示しています。

namespace Sitecore.Commerce.Plugin.Orders
{
 using Sitecore.Commerce.Core;
    using Sitecore.Framework.Pipelines;
    /// <summary>
    /// Defines the create order pipeline.
    /// </summary>
    PipelineDisplayName(OrdersConstants.Pipelines.CreateOrder)
    public interface ICreateOrderPipeline :IPipeline<CartEmailArgument, Order, CommercePipelineExecutionContext>
    {
    }
}

商業パイプラインはブロックで構成されています。パイプラインブロックは、動作、動作、ビジネスロジックの実装を担当します。

あなたはコードを使って[Commerce Engineのパイプラインやブロックを作業し、](https://doc.sitecore.com/xp/ja/developers/102/sitecore-experience-commerce/retrieve-registered-pipelines.html "Retrieve registered pipelines")特定のコマースソリューションの要件を満たすように拡張します。

以下は、注文が入力された際に割り当てられる固有のIDを生成する責任を持つCommerceパイプラインブロックOrderPlacedAssignConfirmationIdBlockの例です。

namespace Sitecore.Commerce.Plugin.Orders
{
 using System;
 using System.Globalization,
  using System.Threading.Tasks;
  using Sitecore.Commerce.Core;
 using Sitecore.Commerce.Core.Commands
  using Sitecore.Framework.Conditions;
  using Sitecore.Framework.Pipelines;
  using Microsoft.Extensions.Logging;
 {
 public class OrderPlacedAssignConfirmationIdBlock : AsyncPipelineBlock<Order, Order, CommercePipelineExecutionContext>
 {
 private readonly GenerateUniqueCodeCommand \_generateUniqueCodeCommand;
 public OrderPlacedAssignConfirmationIdBlock(GenerateUniqueCodeCommand generateUniqueCodeCommand)
 {
 \_generateUniqueCodeCommand = generateUniqueCodeCommand;
 }
 public override async Task<Order> RunAsync(Order arg, CommercePipelineExecutionContext context)
 {
 Condition.Requires(arg).IsNotNull($"{Name}: The order can not be null");
 var uniqueCode = Guid.NewGuid().ToString("N", CultureInfo.InvariantCulture);
 try
 {
 uniqueCode = await \_generateUniqueCodeCommand.Process(context.CommerceContext).ConfigureAwait(false);

 }
 catch (Exception ex)
 {
 context.CommerceContext.LogException($"{Name}-UniqueCodeException", ex);
 }
 arg.OrderConfirmationId = uniqueCode;
 return arg;
 }
 }
}
## ConfigureSitecore

configure.sitecoreクラスは、プラグインが定義するすべてのパイプラインからブロック定義をリストアップ、オーケストレーション、レジスタする役割を担います。パイプライン構成によって、各パイプラインブロックを実行する順序が決まります。パイプラインが起動すると、configure.sitecoreクラス内の情報を使ってどのブロックを実行するかを判断します。[既存のパイプラインに新しいカスタムブロックを追加](https://doc.sitecore.com/xp/ja/developers/102/sitecore-experience-commerce/working-with-commerce-engine-pipelines-and-blocks.html "Working with Commerce Engine pipelines and blocks")したり、新しいパイプラインを作成する際には、カスタムパイプラインとブロックをconfigure.sitecoreクラスに挿入し、必要な順序で処理されるようにしなければなりません。

以下は、[Commerce Engine SDK](https://doc.sitecore.com/xp/ja/developers/102/sitecore-experience-commerce/sitecore-commerce-engine-sdk.html "Sitecore Commerce Engine SDK")の一部として含まれているサンプルのBraintree決済プロバイダープラグインに付属する、configure.sitecoreクラスの例です。

namespace Plugin.Sample.Payments.Braintree
{
 /// <summary>
 /// The payments braintree configure sitecore class
 /// </summary>
 /// <seealso cref="Sitecore.Framework.Configuration.IConfigureSitecore" />
 public class ConfigureSitecore : IConfigureSitecore
 {
 /// <summary>
 /// The configure services.
 /// </summary>
 /// <param name="services">
 /// The services.
 /// </param>
 ///
 public void ConfigureServices(IServiceCollection services)
 {
 var assembly = Assembly.GetExecutingAssembly();
 services.RegisterAllPipelineBlocks(assembly);

 services.Sitecore().Pipelines(config => config
 .ConfigurePipeline<IGetClientTokenPipeline>(d => { d.Add<GetClientTokenBlock>(); })
 .ConfigurePipeline<ICreateOrderPipeline>(d => { d.Add<CreateFederatedPaymentBlock>().Before<CreateOrderBlock>(); })
 .ConfigurePipeline<IReleaseOnHoldOrderPipeline>(d => { d.Add<UpdateFederatedPaymentBlock>().After<ValidateOnHoldOrderBlock>(); })
 .ConfigurePipeline<IRefundPaymentsPipeline>(d => { d.Add<RefundFederatedPaymentBlock>().Before<PrepArgumentToPersistEntityBlock<Order>>(); })
 .ConfigurePipeline<ICancelOrderPipeline>(d => { d.Add<VoidCancelOrderFederatedPaymentBlock>().After<GetPendingOrderBlock>(); })
 .ConfigurePipeline<IRunningPluginsPipeline>(c => { c.Add<RegisteredPluginBlock>().After<RunningPluginsBlock>(); })
 .ConfigurePipeline<IReleasedOrdersMinionPipeline>(c => { c.Add<SettleOrderSalesActivitiesBlock>().After<SettlePaymentFaultBlock>(); }));
 services.RegisterAllCommands(assembly);
 }
 }
}
## 方針

Commerce Engineポリシーは、Commerce Engine内の機能や機能、または機能に影響を与える設定群です。Commerceポリシーは通常、ビジネスニーズによって駆動され、ストアフロントの挙動にも影響します。ポリシーは大量にキャッシュされており、デプロイシナリオ以外ではその値がほとんど変わりません。ポリシー設定は .JSON設定ファイルを使って設定します。 [ブートストラップ](https://doc.sitecore.com/xp/ja/developers/102/sitecore-experience-commerce/bootstrap-the-commerce-engine.html "Bootstrap the Commerce Engine") プロセスでは、設定が集中型のポリシーストアに初期化されます。

以下はポリシー定義クラス(CartCouponsPolicy)の例を示します:

using Sitecore.Commerce.Core;
namespace Sitecore.Commerce.Plugin.Coupons
{
 /// <summary>
 /// The CartCouponsPolicy.
 /// </summary>
 public class CartCouponsPolicy : QualifyPolicy
 {
 /// <summary>
 /// Initializes a new instance of the <see cref="CartCouponsPolicy"/> class.
 /// </summary>
 public CartCouponsPolicy()
 { MaxCouponsInCart = 5;
 }
 /// <summary>
 /// Gets or sets the maximum coupons in cart.
 /// </summary>
 /// <value>
 /// The maximum coupons in cart.
 /// </value>
 public int MaxCouponsInCart { get; set; }
 }
}

## 手下たち

コマースプラグインは [ミニオン](https://doc.sitecore.com/xp/ja/developers/102/sitecore-experience-commerce/commerce-engine-minions.html "Commerce Engine minions")を貢献できます。コマースミニオンはワーカープロセスであり、プロセス内の特定のタスクを実行するための基本的な作業単位として実装されています。