---
title: "計算された側面を作成します"
slug: "create-a-calculated-facet"
abstract: "計算されたxConnectファセットの作成方法。"
---
# 計算された側面を作成します

このトピックでは、AverageSpendと名付けられた計算されたファセットの実装方法を示します。このファセットは、1回あたりの平均支出を含む、コンタクトの購入履歴に関するデータを保存します。

## ファセットを作成して登録してください

1.  ファセットクラスを作成する:
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Documentation
    {
     FacetKey(MyCollectionModel.FacetKeys.AverageSpend)
     public class AverageSpend : Sitecore.XConnect.Facet
     {
     public const string DefaultFacetKey = MyCollectionModel.FacetKeys.AverageSpend;
    
     public int TotalPurchases { get; set; }
     public decimal TotalSpend { get; set; } // Assumes single currency
     public decimal AverageSpendPerPurchase { get; set; }
     }
    }
    
    > !注この例は、すべての購入が同じ通貨で行われることを前提としています。
    
2.  [モデルにファセットを登録する:](https://doc.sitecore.com/xp/ja/developers/93/sitecore-experience-platform/create-a-custom-model.html "Create a custom model")
    
    modelBuilder.DefineFacet<Contact, AverageSpend>(AverageSpend.DefaultFacetKey);
    

## 計算されたファセットプラグインを実装してください

1.  計算されたファセットハンドラーを作成し、Sitecore.XConnect.Service.MergingCalculatedFacetHandler<AverageSpend>を実装します。以下の点に注目してください。
    
    -   InteractionFacetDependencyオブジェクトがベースハンドラーに渡されます。これにより、WebVisitファセットがインタラクションに存在すればロードされます。しかし、ハンドラーが実行するためにファセットは必須ではありません。
    -   Merge()法は、2つのコンタクトが統合された際にこのファセットに何が起こるかを決定します。この方法では、総支出と総購入を合計し、1回あたりの平均支出を再計算します。計算されたファセットにはMerge()メソッドを実装する必要があります。
    -   UpdateFacet()メソッドは、新しいやり取りがxConnectに提出されたときに何が起こるかを決定します。
    -   すべてのメソッドはファセットが更新されていれば true を返します。
    
    using Sitecore.XConnect;
    using Sitecore.XConnect.Collection.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Documentation
    {
     public class AverageSpendHandler : Sitecore.XConnect.Service.MergingCalculatedFacetHandler<AverageSpend>
     {
     public AverageSpendHandler() : base(AverageSpend.DefaultFacetKey, new { new Sitecore.XConnect.Service.InteractionFacetDependency(WebVisit.DefaultFacetKey, false) })
     {
     }
    
     protected override bool Merge(AverageSpend source, AverageSpend target)
     {
     if (source.TotalSpend > 0)
     {
     target.TotalSpend += source.TotalSpend;
     target.TotalPurchases += source.TotalPurchases;
    
     target.AverageSpendPerPurchase = target.TotalSpend / target.TotalPurchases;
    
     return true;
     }
    
     return false;
     }
    
     protected override bool UpdateFacet(AverageSpend currentFacet, Sitecore.XConnect.Interaction interaction)
     {
     bool edited = false;
    
     var referrer = interaction.WebVisit() != null ? interaction.WebVisit().Referrer : String.Empty;
    
     if (!String.IsNullOrEmpty(referrer))
     {
     currentFacet.LatestReferrer = referrer;
     edited = true;
     }
    
     var outcomes = interaction.Events.OfType<Outcome>(); // Get all purchase outcomes in interaction
    
     if (outcomes != null && outcomes.Any())
     {
     foreach (var purchase in outcomes)
     {
     currentFacet.TotalPurchases++; // If there are purchases, increment purchase count
     currentFacet.TotalSpend += purchase.MonetaryValue;
     }
    
     // Set average spend per purchase (NOT spend per visit)
     currentFacet.AverageSpendPerPurchase = currentFacet.TotalSpend / currentFacet.TotalPurchases;
     }
    
     return edited;
     }
     }
    
    > !注任意のInteractionFacetDependencyのRequiredプロパティがtrueに設定されている場合、ハンドラーはこの側面がインタラクションに存在している場合にのみ実行します。
    
2.  xConnectで \\App\_data\\config\\sitecore\\Collection\\sc.XConnect.Collection.Model.Plugins.xml設定ファイルを開いてください。
    
3.  ハンドラーのエントリを2つ追加します。1つはICalculatedFacetHandler 、もう1つはIContactMergeHandler:
    
    <ICalculatedFacetHandler.AverageSpendHandler>
     <Type>Documentation.AverageSpendHandler, Documentation</Type>
     <As>Sitecore.XConnect.Service.ICalculatedFacetHandler, Sitecore.XConnect.Service</As>
     <LifeTime>Singleton</LifeTime>
    </ICalculatedFacetHandler.AverageSpendHandler>
    
    <IContactMergeHandler.AverageSpendHandler>
     <Type>Documentation.AverageSpendHandler, Documentation</Type>
     <As>Sitecore.XConnect.Service.IContactMergeHandler, Sitecore.XConnect.Service</As>
     <LifeTime>Singleton</LifeTime>
    </IContactMergeHandler.AverageSpendHandler>
    

## 設定オプションを通す

設定オプションを計算されたファセットハンドラに渡すことができます。以下の例では、設定オプションがAverageSpendファセットのLatestReferrerプロパティを設定するかどうかを制御します。

1.  オプションを表す公共財産を追加してください。例えば、public bool PopulateReferrer { get; }。
    
2.  IConfigurationオブジェクトを取るコンストラクタを追加します。以下のシナリオでは、設定オプションがPopulateReferrerと名付けられていると仮定しています:
    
    using Microsoft.Extensions.Configuration;
    using Sitecore.XConnect;
    using Sitecore.XConnect.Collection.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Documentation
    {
     public class AverageSpendHandler : Sitecore.XConnect.Service.MergingCalculatedFacetHandler<AverageSpend>
     {
    
     public AverageSpendHandler(IConfiguration options) : this(options.GetValue<bool>(nameof(PopulateReferrer)))
     {
     }
    
     public AverageSpendHandler(bool populateReferrer) : base(AverageSpend.DefaultFacetKey, new { new Sitecore.XConnect.Service.InteractionFacetDependency(WebVisit.DefaultFacetKey, false) })
     {
     PopulateReferrer = populateReferrer;
     }
    
     public bool PopulateReferrer { get; }
    
     protected override bool Merge(AverageSpend source, AverageSpend target)
     {
     bool edited = false;
    
     if (PopulateReferrer)
     {
     if (String.IsNullOrEmpty(target.LatestReferrer))
     {
     target.LatestReferrer = source.LatestReferrer;
     edited = true;
     }
     }
    
     if (source.TotalSpend > 0)
     {
     target.TotalSpend += source.TotalSpend;
     target.TotalPurchases += source.TotalPurchases;
    
     target.AverageSpendPerPurchase = target.TotalSpend / target.TotalPurchases;
    
     return edited;
     }
    
     return false;
     }
    
     protected override bool UpdateFacet(AverageSpend currentFacet, Sitecore.XConnect.Interaction interaction)
     {
     bool edited = false;
    
     var referrer = interaction.WebVisit() != null ? interaction.WebVisit().Referrer : String.Empty;
    
     if (PopulateReferrer && !String.IsNullOrEmpty(referrer))
     {
     currentFacet.LatestReferrer = referrer;
     edited = true;
     }
    
     var outcomes = interaction.Events.OfType<Outcome>(); // Get all purchase outcomes in interaction
    
     if (outcomes != null && outcomes.Any())
     {
     foreach (var purchase in outcomes)
     {
     currentFacet.TotalPurchases++; // If there are purchases, increment purchase count
     currentFacet.TotalSpend += purchase.MonetaryValue;
     }
    
     // Set average spend per purchase (NOT spend per visit)
     currentFacet.AverageSpendPerPurchase = currentFacet.TotalSpend / currentFacet.TotalPurchases;
     }
    
     return edited;
     }
     }
    }
    
3.  \\App\_data\\config\\sitecore\\Collection\\sc.XConnect.Collection.Model.Plugins.xmlを開き、表示されたように設定にオプションを追加してください。マージや更新中にオプションが使われている場合は、表示通りに2回指定してください。
    
    <ICalculatedFacetHandler.AverageSpendHandler>
     <Type>Documentation.AverageSpendHandler, Documentation</Type>
     <As>Sitecore.XConnect.Service.ICalculatedFacetHandler, Sitecore.XConnect.Service</As>
     <LifeTime>Singleton</LifeTime>
     <Options>
     <PopulateReferrer>true</PopulateReferrer>
     </Options>
    </ICalculatedFacetHandler.AverageSpendHandler>
    
    <IContactMergeHandler.AverageSpendHandler>
     <Type>Documentation.AverageSpendHandler, Documentation</Type>
     <As>Sitecore.XConnect.Service.IContactMergeHandler, Sitecore.XConnect.Service</As>
     <LifeTime>Singleton</LifeTime>
     <Options>
     <PopulateReferrer>true</PopulateReferrer>
     </Options>
    </IContactMergeHandler.AverageSpendHandler>
    

## 計算された側面を把握しましょう

xConnect Client APIを使って、他のファセットと同様に計算されたファセットを取得してください。計算されたファセットを直接編集しないでください。