---
title: "RequestContextプロパティ"
slug: "requestcontext-property"
abstract: "パイプラインプロセッサとパイプライン間で情報を交換するために使われるRequestContextプロパティの概要。"
---
# RequestContextプロパティ

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.PropertiesPipelineContextNames.CartPipelineContext as CartPipelineContext;
 if (pipelineContext == null)
 {
 pipelineContext = new CartPipelineContext();
 requestContext.PropertiesPipelineContextNames.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コレクションに追加されます。次に、コードは単に実際のCommerce ServerバスケットにcartContext.Basketクラスを設定します。

他のすべてのプロセッサ、RunSaveCartパイプラインも含めて、RequestContextプロパティからバスケットを取得するために以下の手順を単純に実行します。

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

この時点で、cartContext.Basketクラスを使ってCommerce Serverバスケットで必要な操作(例えば行項目の追加)を行うことができます。