RequestContextプロパティ

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

ServiceProviderRequestクラスのRequestContextプロパティを使用して、パイプライン プロセッサとパイプライン間で情報を交換できます。

たとえば、CommerceServer Connect ECSはRequestContextプロパティを使用してプロセッサ間でバスケットを共有します。したがって、パイプラインの実行中にバスケットが一度だけ読み込まれるようにすることで、プロセッサのモジュール性とパフォーマンスを促進します。

以下は、AddCartLinesパイプラインの簡略化されたバージョンです。

<commerce.carts.addCartLines>
  <!--  Setup the commerce server context  -->
  <processor type="Sitecore.Commerce.Connect.CommerceServer.Orders.Pipelines.ResolveBasket, Sitecore.Commerce.Connect.CommerceServer" />
  <processor type="Sitecore.Commerce.Connect.CommerceServer.Orders.Pipelines.AddLinesToCart, Sitecore.Commerce.Connect.CommerceServer" >
    <param desc="Rollup">True</param>
    <param ref="eaPlanProvider"/>
    <param ref="eaStateCartRepository"/>
  </processor>
  <processor type="Sitecore.Reference.Storefront.Connect.Pipelines.Carts.RunPipeline, Sitecore.Reference.Storefront.Powered.by.CommerceServer">
    <param desc="pipelineName">Basket</param>
  </processor>
  <processor type="Sitecore.Reference.Storefront.Connect.Pipelines.Carts.RunTotalPipeline, Sitecore.Reference.Storefront.Powered.by.CommerceServer">
    <param desc="pipelineName">Total</param>
  </processor>
  <processor type="Sitecore.Commerce.Pipelines.Carts.Common.RunSaveCart, Sitecore.Commerce.Connect.Core"/>
</commerce.carts.addCartLines>

上記の例では、すべてのカート関連操作の最初のプロセッサがResolveBasketプロセッサを使用します。このプロセッサは、Commerce Serverのバスケットの読み込みと要求コンテキストの設定を担当します。他のすべてのプロセッサは、要求コンテキストからCommerce Serverバスケットをフェッチします。

最後のプロセッサRunSaveCartは、バスケットを保存するために別のパイプラインを呼び出します。要求コンテキストは自動的にこのパイプラインに流れ、その内容を保存するためにバスケットをフェッチできます。

次に、CartPipelineContextユーティリティ・クラスを示します。

public class CartPipelineContext : PipelineContext
{
protected CartPipelineContext()
: base(PipelineContextNames.CartPipelineContext)
   {
   this.HasBasketErrors = false;
   }
public Basket Basket { get; set; }
public static CartPipelineContext Get(ServiceProviderRequestContext requestContext)
   {
      CartPipelineContext pipelineContext = requestContext.Properties[PipelineContextNames.CartPipelineContext] as CartPipelineContext;
      if (pipelineContext == null)
      {
         pipelineContext = new CartPipelineContext();
         requestContext.Properties[PipelineContextNames.CartPipelineContext] = pipelineContext;
      }
      return pipelineContext;
    }
 }

上記のコードでは、静的Get() メソッドが、RequestContextプロパティからCartPipelineContextインスタンスを作成および取得するための便利な方法を提供します。キーと値のペアが要求コンテキストのPropertiesコレクションに追加されることに注意してください。この名前を一意にして、他のプロセッサによって追加される可能性のある他の要求コンテキスト項目と競合しないようにすることが重要です。

次に、ResolveBasketプロセッサのコードスニペットを示します。

IOrderRepository repository = CommerceTypeLoader.CreateInstance<IOrderRepository>();
var cartContext = CartPipelineContext.Get(args.Request.RequestContext);
cartContext.Basket = repository.GetBasket(Guid.Parse(userId), cartName);

CartPipelineContext.Get() クラスの呼び出しは最初のプロセッサから発行されるため、コンテキスト クラスが作成され、RequestContextコレクションに追加されます。次に、コードは単にcartContext.Basketクラスを実際のCommerce Serverバスケットに設定します。

RunSaveCartパイプラインを含む他のすべてのプロセッサは、次の操作を実行して、RequestContextプロパティからバスケットを取得します。

var cartContext = CartPipelineContext.Get(request.RequestContext);
Assert.IsNotNull(cartContext, "cartContext");
Assert.IsNotNull(cartContext.Basket, "cartContext.Basket");

この時点で、cartContext.Basketクラスを使って、Commerce Serverの買い物かごで必要な操作 (品目の追加など) を実行できます。

この記事を改善するための提案がある場合は、 お知らせください!