---
title: "カスタムプロセッサを作成する"
slug: "create-a-custom-processor"
abstract: ""
---
# カスタムプロセッサを作成する

双方向同期が機能するためには、Sitecoreから発信する2つのエンティティと外部システムから発信する2つのエンティティを比較するプロセッサが存在する必要があります。

ベースプロセッサSitecore.Commerce.Pipelines.Products.ResolveChangesProcessorほとんどの作業を行い、比較用に設定されたSynchronizationStrategyを解析します。

プロセッサの責任は、Sitecoreと外部システムからそれぞれ2つの製品エンティティを読み取り、変更を比較・解決し、結果を保存すべき場所を示すとともに返すことです。

> !注現在のResolveChangesProcessor実装では、保存される結果のエンティティの集合は1つだけなので、方向が両方に設定されている場合、同じインスタンスがSitecoreと外部システムの両方に保存されます。
> 
> カスタムバージョンでは、異なるバージョンを2つの別々のコレクションに保存し、それぞれのシステムに保存することができます。

> !注Sitecoreから製品エンティティを読み取る責任を持つ2つのプロセッサは、結果を2つの異なるパイプライン引数に書き込み、干渉しないようにしなければなりません。

特定のエンティティタイプに対してカスタムプロセッサを作成するには:

1.  ResolveChangesProcessorプロセッサから継承する新しいクラスを作成します。
    
    コンストラクタは空にしておき、ベースコンストラクタを必ず呼び出してください。
    
2.  GetSitecoreEntitiesメソッドを上書きしてください。
    
    メソッドは保存されたSitecoreエンティティを読み取り、与えられた型の可算可能なオブジェクトの集合を返さなければなりません。 PipelineArgsコレクションの命名規則は、型名の前にkeyとしてSitecoreという単語を接頭辞として付けることです。例えば、SitecoreManufacturers。
    
3.  GetExternalCommerceSystemEntitiesメソッドを上書きしてください。
    
    メソッドは保存された外部エンティティを読み取り、与えられた型のオブジェクトの列挙可能な集合を返さなければなりません。 PipelineArgsの命名規則は、単に型名をキーとして使うことです。例えば、Manufacturers。
    
4.  SaveEntitiesメソッドを上書きしてください。
    
    メソッドは得られたエンティティをPipelineArgsコレクションに保存しなければなりません。命名規則としては型名をキーとして使います。例えば、Manufacturers。
    

ResolveManufacturerChangesプロセッサの実装は以下のコードスニペットで示されています。

public class ResolveManufacturersChanges : ResolveChangesProcessor

{
/// <summary>
/// Initializes an instance of the <see cref="ResolveManufacturersChanges" /> class.
/// </summary>
/// <param name="synchronizationStrategy">The synchronization strategy.</param>
public ResolveManufacturersChanges(NotNull ISynchronizationStrategy synchronizationStrategy) : base(synchronizationStrategy)
{
}

/// <summary>
/// Gets entities stored in Sitecore.
/// </summary>
/// <param name="args">The arguments.</param>
/// <returns>Sitecore entities.</returns>
protected override IEnumerable<ProductEntity> GetSitecoreEntities(ServicePipelineArgs args)
{
return args.Request.Properties"SitecoreManufacturers" as IEnumerable<ProductEntity> ?? Enumerable.Empty<Manufacturer>();
}
/// <summary>
/// Gets entities stored in external commerce system.
/// </summary>
/// <param name="args">The arguments.</param>
/// <returns>External commerce system entities.</returns>
protected override IEnumerable<ProductEntity> GetExternalCommerceSystemEntities(ServicePipelineArgs args)
{
return args.Request.Properties"Manufacturers" as IEnumerable<ProductEntity> ?? Enumerable.Empty<Manufacturer>();
}
/// <summary>
/// Saves the entities to the arguments.
/// </summary>
/// <param name="args">The arguments.</param>
/// <param name="productEntities">The product entities.</param>
protected override void SaveEntities(ServicePipelineArgs args, IEnumerable<ProductEntity> productEntities)
{
args.Request.Properties"Manufacturers" = productEntities.Cast<Manufacturer>();
}
}