---
title: "ウォークスルー:カスタムファセットとイベントの作成"
slug: "walkthrough--creating-custom-facets-and-events"
abstract: "Sitecore xConnectでカスタムファセットやイベントを作成する方法。"
---
# ウォークスルー:カスタムファセットとイベントの作成

このウォークスルーは「[エクステンディング・ザ・xConnectコレクション」モデルウォークスルーシリーズ](https://doc.sitecore.com/xp/ja/developers/93/sitecore-experience-platform/extending-the-xconnect-collection-model-walkthrough-series.html "Extending the xConnect collection model walkthrough series")の第5部です。このウォークスルーを完了するには、まずパート[1](https://doc.sitecore.com/xp/ja/developers/93/sitecore-experience-platform/walkthrough--creating-a-contact-and-an-interaction.html "Walkthrough: Creating a contact and an interaction")、[2](https://doc.sitecore.com/xp/ja/developers/93/sitecore-experience-platform/walkthrough--setting-contact-and-interaction-facets.html "Walkthrough: Setting contact and interaction facets")、[3](https://doc.sitecore.com/xp/ja/developers/93/sitecore-experience-platform/walkthrough--getting-contacts.html "Walkthrough: Getting contacts")、[4](https://doc.sitecore.com/xp/ja/developers/93/sitecore-experience-platform/walkthrough--searching-contacts-and-interactions.html "Walkthrough: Searching contacts and interactions")のウォークスルーをクリアする必要があります。

このウォークスルーでは、あなたは*Sitecore Cinema*、訪問者から情報を集めるために収集モデルを拡張しなければなりません。情報は、訪問者が映画館と交流するたびにロイヤルティカードをスワイプすることに依存しており、訪問のインセンティブとして、ロイヤルティカードを10回使用すると無料のポップコーンが提供されます。

このウォークスルーでは、以下の方法を説明しています:

-   SitecoreCinemaソリューションとクラスライブラリプロジェクトを作成しましょう
-   CinemaInfoインタラクションの側面クラスを作成する
-   CinemaVisitorInfo コンタクトの面クラスを作成します
-   WatchMovieアウトカムアイテムを作成する
-   WatchMovie結果クラスを作成する
-   BuyConcessionsアウトカムアイテムを作成する
-   BuyConcessions結果クラスを作成する
-   UseSelfServiceイベントアイテムを作成する
-   UseSelfServiceイベントクラスを作成する
-   SitecoreCinemaModelコレクションモデルクラスを作成します
-   Console.Deployコンソールアプリプロジェクトを作成しましょう
-   コレクションモデル SitecoreCinemaModel シリアライズ
-   Console.Journeyコンソールアプリプロジェクトを作成しましょう
-   Sitecoreシネマ訪問をシミュレートする

> !注Sitecore 9.1.0のSitecore.Xdb.Common.Web名前空間では:
> 
> -   Certificate\*\*WebRequest\*\*HandlerModifierOptionsCertificate\*\*HttpClient\*\*HandlerModifierOptionsになった。
>     
> -   Certificate\*\*WebRequest\*\*HandlerModifierCertificate\*\*HttpClient\*\*HandlerModifierになった。
>     

## SitecoreCinemaソリューションとクラスライブラリプロジェクトを作成する

SitecoreCinemaソリューションおよびクラスライブラリプロジェクトを作成するには:

1.  管理者権限を用いてVisual Studio、フレームワーク用の新しいソリューションおよびクラスライブラリプロジェクトを作成.NET SitecoreCinema:
    
    ![The Configure your new project dialogue box in Visual Studio.](https://doc.sitecore.com/api/markdown-image/xp/ja/developers/93/sitecore-experience-platform/images/xconn-tut5-new-proj.png)
    
2.  Solution Explorerで右クリックSitecoreCinema/References 「 **参照を追加**」をクリックします。
    
3.  **参照管理者**のウィンドウで「**Browse**」をクリックして、<xConnect instance>\\bin\\フォルダから以下の参照を追加してください:
    
    -   Sitecore.XConnect.Collection.Model.dll
    -   Sitecore.XConnect.Core
    -   Sitecore.XConnect.dll
4.  **OK**をクリックします。
    

## CinemaInfoのインタラクションファセットクラスを作成します

CinemaInfoクラスは、交流中に訪れた映画館に関する情報を含むインタラクションの側面です。

CinemaInfoインタラクション面クラスを作成するには:

1.  管理者権限でVisual Studio、Solution ExplorerでSitecoreCinemaプロジェクトを右クリックして「 **追加**、**新しい項目**」をクリックします。
    
2.  **「新しいアイテムを追加**」ウィンドウで:
    
    -   左側のペインで Installed/Visual C# Itemsをクリックします。
    -   中央のパネルで「 **クラス**」をクリックします。
    -   下部の **「Name** 」欄で「 CinemaInfo.cs 」を入力し、「 **追加**」をクリックします。
3.  CinemaInfo.csファイルでは、内容を以下のコードに置き換えます:
    
    using Sitecore.XConnect;
    
    namespace SitecoreCinema.Model.Collection
    {
     FacetKey(DefaultFacetKey)
     public class CinemaInfo : Facet
     {
     public const string DefaultFacetKey = "CinemaInfo";
     public int CinemaId { get; set; }
     }
    }
    
4.  CinemaInfo.csファイルを保存してください。
    

## CinemaVisitorInfoの連絡先ファセットクラスを作成する

CinemaVisitorInfoクラスは、ロイヤルティの情報を含む連絡先の側面であり、ロイヤルティIDなどです。

CinemaVisitorInfo接触面クラスを作成するには:

1.  管理者権限でVisual Studio、Solution ExplorerでSitecoreCinemaプロジェクトを右クリックして「 **追加**、**新しい項目**」をクリックします。
    
2.  **「新しいアイテムを追加**」ウィンドウで:
    
    -   左側のペインで Installed/Visual C# Itemsをクリックします。
    -   中央のパネルで「 **クラス**」をクリックします。
    -   下部の **「Name** 」欄で「 CinemaVisitorInfo.cs 」を入力し、「 **追加**」をクリックします。
3.  CinemaVisitorInfo.csファイルでは、内容を以下のコードに置き換えます:
    
    using Sitecore.XConnect;
    
    namespace SitecoreCinema.Model.Collection
    {
     FacetKey(DefaultFacetKey)
     public class CinemaVisitorInfo : Facet
     {
     public const string DefaultFacetKey = "CinemaVisitorInfo";
     public string FavoriteMovie { get; set; }
     }
    }
    
4.  CinemaVisitorInfo.csファイルを保存してください。
    

## WatchMovieの結果項目を作成する

WatchMovie結果項目を作成するには:

1.  マーケティングコントロールパネルで *Marketing Control Panel/Outcomes*をクリックします。
2.  **オプション**ペインで**「結果定義**」をクリックします。
3.  **メッセージ**ウィンドウでWatchMovieを入力し、**OK**をクリックします。
4.  **クイックインフォ**のセクションで、アイテムIDをメモしてください。

## WatchMovieの結果クラスを作成する

WatchMovie結果クラスは、来訪者が映画チケットを購入する際に販売時点管理システムからWatchMovie結果項目をトリガーします。

WatchMovie結果クラスを作成するには:

1.  管理者権限でVisual Studio、Solution ExplorerでSitecoreCinemaプロジェクトを右クリックして「 **追加**、**新しい項目**」をクリックします。
    
2.  **「新しいアイテムを追加**」ウィンドウで:
    
    -   左側のペインで Installed/Visual C# Itemsをクリックします。
    -   中央のパネルで「 **クラス**」をクリックします。
    -   下部の **「Name** 」欄で「 WatchMovie.cs 」を入力し、「 **追加**」をクリックします。
3.  WatchMovie.csファイルでは、内容を以下のコードに置き換えます:
    
    using Sitecore.XConnect;
    using System;
    
    namespace SitecoreCinema.Model.Collection
    {
     public class WatchMovie : Outcome
     {
     public static Guid EventDefinitionId { get; } = new Guid("<WATCHMOVIE OUTCOME ITEM ID>");
    
     public WatchMovie(
     DateTime timestamp,
     string currencyCode,
     decimal monetaryValue
     ) : base(EventDefinitionId, timestamp, currencyCode, monetaryValue) { }
    
     // Entertainment Identifier Registry number (see https://eidr.org/)
     public string EIDR { get; set; }
     }
    }
    
4.  WatchMovie結果項目をID挿入します。
    
5.  WatchMovie.csファイルを保存してください。
    

## BuyConcessionsの成果項目を作成しました

BuyConcessions結果項目を作成するには:

1.  マーケティングコントロールパネルで *Marketing Control Panel/Outcomes*をクリックします。
2.  **オプション**ペインで**「結果定義**」をクリックします。
3.  **メッセージ**ウィンドウでBuyConcessionsを入力し、**OK**をクリックします。
4.  **クイックインフォ**のセクションで、アイテムIDをメモしてください。

## BuyConcessionsの結果クラスを作成する

BuyConcessions結果クラスは、訪問者が売店を購入する際に販売時点管理システムからBuyConcessions結果項目をトリガーします。

BuyConcessions結果クラスを作成するには:

1.  管理者権限でVisual Studio、Solution ExplorerでSitecoreCinemaプロジェクトを右クリックして「 **追加**、**新しい項目**」をクリックします。
    
2.  **「新しいアイテムを追加**」ウィンドウで:
    
    -   左側のペインで Installed/Visual C# Itemsをクリックします。
    -   中央のパネルで「 **クラス**」をクリックします。
    -   下部の **「Name** 」欄で「 BuyConcessions.cs 」を入力し、「 **追加**」をクリックします。
3.  BuyConcessions.csファイルでは、内容を以下のコードに置き換えます:
    
    using Sitecore.XConnect;
    using System;
    
    namespace SitecoreCinema.Model.Collection
    {
     public class BuyConcessions : Outcome
     {
     public static Guid EventDefinitionId { get; } = new Guid("<BUYCONCESSIONS OUTCOME ITEM ID>");
    
     public BuyConcessions(
     DateTime timestamp,
     string currencyCode,
     decimal monetaryValue
     ) : base(EventDefinitionId, timestamp, currencyCode, monetaryValue) { }
    
     public bool BoughtAlcoholicDrink { get; set; }
     }
    }
    
4.  BuyConcessions結果項目をID挿入します。
    
5.  BuyConcessions.csファイルを保存してください。
    

## UseSelfServiceイベント項目を作成する

UseSelfServiceイベントアイテムを作成するには:

1.  マーケティングコントロールパネルで *Marketing Control Panel/Events*をクリックします。
2.  **オプション**画面で**イベント**をクリックします。
3.  **メッセージ**ウィンドウでUseSelfServiceを入力し、**OK**をクリックします。
4.  **クイックインフォ**のセクションで、アイテムIDをメモしてください。

## UseSelfServiceイベントクラスを作成する

UseSelfServiceイベントクラスは、来場者が映画チケットを購入すると、チケット販売機からUseSelfServiceイベントアイテムが発動します。

UseSelfServiceイベントクラスを作成するには:

1.  管理者権限でVisual Studio、Solution ExplorerでSitecoreCinemaプロジェクトを右クリックして「 **追加**、**新しい項目**」をクリックします。
    
2.  **「新しいアイテムを追加**」ウィンドウで:
    
    -   左側のペインで Installed/Visual C# Itemsをクリックします。
    -   中央のパネルで「 **クラス**」をクリックします。
    -   下部の **「Name** 」欄で「 UseSelfService.cs 」を入力し、「 **追加**」をクリックします。
3.  UseSelfService.csファイルでは、内容を以下のコードに置き換えます:
    
    using Sitecore.XConnect;
    using System;
    
    namespace SitecoreCinema.Model.Collection
    {
     public class UseSelfService : Event
     {
     public static Guid EventDefinitionId { get; } = new Guid("<USESELFSERVICE EVENT ITEM ID>");
     public UseSelfService(DateTime timestamp) : base(EventDefinitionId, timestamp) { }
     }
    }
    
4.  UseSelfServiceイベントアイテムをID挿入します。
    
5.  UseSelfService.csファイルを保存してください。
    

## SitecoreCinemaModelコレクションモデルクラスを作成します

SitecoreCinemaModelコレクションモデルクラスを作成するには:

1.  管理者権限を持つVisual Studioで、Solution Explorerで右クリックしてSitecoreCinemaを右クリックし、「 **追加**、**新しい項目**」をクリックします。
    
2.  **「新しいアイテムを追加**」ウィンドウで:
    
    -   左側のペインで Installed/Visual C# Itemsをクリックします。
    -   中央のパネルで「 **クラス**」をクリックします。
    -   下部の **「Name** 」欄で「 SitecoreCinemaModel.cs 」を入力し、「 **追加**」をクリックします。
3.  SitecoreCinemaModel.csファイルでは、内容を以下のコードに置き換えます:
    
    using Sitecore.XConnect;
    using Sitecore.XConnect.Schema;
    
    namespace SitecoreCinema.Model.Collection
    {
     public class SitecoreCinemaModel
     {
     public static XdbModel Model { get; } = BuildModel();
    
     private static XdbModel BuildModel()
     {
     XdbModelBuilder modelBuilder = new XdbModelBuilder("SitecoreCinemaModel", new XdbModelVersion(1, 0));
    
     modelBuilder.DefineFacet<Contact, CinemaVisitorInfo>(FacetKeys.CinemaVisitorInfo);
     modelBuilder.DefineFacet<Interaction, CinemaInfo>(FacetKeys.CinemaInfo);
     modelBuilder.DefineEventType<WatchMovie>(false);
     modelBuilder.DefineEventType<BuyConcessions>(false);
     modelBuilder.DefineEventType<UseSelfService>(false);
     modelBuilder.ReferenceModel(Sitecore.XConnect.Collection.Model.CollectionModel.Model);
    
     return modelBuilder.BuildModel();
     }
     }
    
     public class FacetKeys
     {
     public const string CinemaInfo = "CinemaInfo";
     public const string CinemaVisitorInfo = "CinemaVisitorInfo";
     }
    }
    
4.  SitecoreCinemaModel.csファイルを保存してください。
    

## Console.Deploy console appプロジェクトを作成してください

Console.DeployコンソールアプリはSitecoreCinemaModelをJSON形式にシリアライズします。

Console.Deployコンソールアプリプロジェクトを作成するには:

1.  管理者権限でVisual Studio、SitecoreCinemaソリューションを右クリックし、「 **追加**、**新しいプロジェクト** 」をクリックして、フレームワーク用の新しいコンソールアプリプロジェクト.NET Console.Deployを作成します。
    
    ![The Configure your new project dialogue box in Visual Studio.](https://doc.sitecore.com/api/markdown-image/xp/ja/developers/93/sitecore-experience-platform/images/xconn-tut5-new-proj2.png)
    
2.  Solution Explorerで右クリックConsole.Deploy/References 「 **参照を追加**」をクリックします。
    
3.  **リファレンスマネージャー**ウィンドウの**プロジェクト**タブでSitecoreCinemaを選択します。
    
4.  **参照管理者**のウィンドウで「**Browse**」をクリックして、<xConnect instance>\\bin\\フォルダから以下の参照を追加してください:
    
    -   Sitecore.XConnect.Core.dll
    -   Sitecore.XConnect.dll
5.  **OK**をクリックします。
    
6.  Solution ExplorerでConsole.Deploy/Program.csファイルをダブルクリックします。
    
7.  Program.csファイルでは、内容を以下のコードに置き換えます:
    
    using System.IO;
    
    namespace SitecoreCinema.Console.Deploy
    {
     public class Program
     {
     public static void Main(string args)
     {
     System.Console.WriteLine("Generating your model ...");
     var model = SitecoreCinema.Model.Collection.SitecoreCinemaModel.Model;
     string filePath = "C:\\\\" + model.FullName + ".json";
     var serializedModel = Sitecore.XConnect.Serialization.XdbModelWriter.Serialize(model);
     File.WriteAllText(filePath, serializedModel);
     System.Console.WriteLine("Your model is here: " + filePath);
     System.Console.WriteLine("Press any key to continue!");
     System.Console.ReadKey();
     }
     }
    }
    
8.  Program.csファイルを保存してください。
    

## SitecoreCinemaModelコレクションモデルのシリアライズ

SitecoreCinemaModel収集モデルをシリアライズするには:

1.  管理者権限でVisual Studio、Solution ExplorerでConsole.Deployプロジェクトを右クリックし、「 **スタートアッププロジェクトとして設定**」をクリックします。
    
2.  Console.Deployアプリを起動してモデルのシリアライズを待つために**「スタート**」をクリックしてください:
    
    ![A terminal with the model details in the app output.](https://doc.sitecore.com/api/markdown-image/xp/ja/developers/93/sitecore-experience-platform/images/xconn-tut5-code1.png)
    
    C:\\SitecoreCinemaModel, 1.0.jsonファイル内のシリアル化されたモデルには、以下の内容が含まれていなければなりません。
    
    {
     "Name": "SitecoreCinemaModel",
     "Version": "1.0",
     "References": 
     {
     "Name": "XConnect",
     "Version": "1.0"
     },
     {
     "Name": "Sitecore.XConnect.Collection.Model",
     "Version": "9.3"
     }
     ,
     "Types": {
     "SitecoreCinema.Model.Collection.CinemaVisitorInfo": {
     "Type": "Facet",
     "BaseType": "Sitecore.XConnect.Facet",
     "ClrType": "SitecoreCinema.Model.Collection.CinemaVisitorInfo, SitecoreCinema, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
     "Properties": {
     "FavoriteMovie": {
     "Type": "String"
     }
     }
     },
     "SitecoreCinema.Model.Collection.CinemaInfo": {
     "Type": "Facet",
     "BaseType": "Sitecore.XConnect.Facet",
     "ClrType": "SitecoreCinema.Model.Collection.CinemaInfo, SitecoreCinema, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
     "Properties": {
     "CinemaId": {
     "Type": "Int32"
     }
     }
     },
     "SitecoreCinema.Model.Collection.WatchMovie": {
     "Type": "Event",
     "BaseType": "Sitecore.XConnect.Outcome",
     "ClrType": "SitecoreCinema.Model.Collection.WatchMovie, SitecoreCinema, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
     "Properties": {
     "EIDR": {
     "Type": "String"
     }
     }
     },
     "SitecoreCinema.Model.Collection.BuyConcessions": {
     "Type": "Event",
     "BaseType": "Sitecore.XConnect.Outcome",
     "ClrType": "SitecoreCinema.Model.Collection.BuyConcessions, SitecoreCinema, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
     "Properties": {
     "BoughtAlcoholicDrink": {
     "Type": "Boolean"
     }
     }
     },
     "SitecoreCinema.Model.Collection.UseSelfService": {
     "Type": "Event",
     "BaseType": "Sitecore.XConnect.Event",
     "ClrType": "SitecoreCinema.Model.Collection.UseSelfService, SitecoreCinema, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
     "Properties": {}
     }
     },
     "Facets": 
     {
     "Target": "Contact",
     "Name": "CinemaVisitorInfo",
     "Type": "SitecoreCinema.Model.Collection.CinemaVisitorInfo"
     },
     {
     "Target": "Interaction",
     "Name": "CinemaInfo",
     "Type": "SitecoreCinema.Model.Collection.CinemaInfo"
     }
     
    }
    
3.  C:\\SitecoreCinemaModel, 1.0.jsonファイルを<xConnect instance>\\App\_Data\\Models\\フォルダにコピーしてください。
    

## Console.Journeyコンソールアプリプロジェクトを作成

Console.Journeyコンソールアプリは、Sitecore映画館を巡る訪問者の旅をシミュレートします:

-   来場者は券売機で映画のチケットを購入します。
-   訪問者は売店でキャンディを買います。
-   来場者は映画館に入るために映画券をスキャンします。

Console.Journeyコンソールアプリプロジェクトを作成するには:

1.  管理者権限でVisual Studio、SitecoreCinemaソリューションを右クリックし、「 **追加**、**新しいプロジェクト** 」をクリックして、フレームワーク用の新しいコンソールアプリプロジェクト.NET Console.Journeyを作成します。
    
    ![The Configure your new project dialogue box in Visual Studio.](https://doc.sitecore.com/api/markdown-image/xp/ja/developers/93/sitecore-experience-platform/images/xconn-tut5-new-proj3.png)
    
2.  Solution Explorerで右クリックConsole.Journey/References 「 **参照を追加**」をクリックします。
    
3.  **リファレンスマネージャー**ウィンドウの**プロジェクト**タブでSitecoreCinemaを選択します。
    
4.  **参照管理者**のウィンドウで「**Browse**」をクリックして、<xConnect instance>\\bin\\フォルダから以下の参照を追加してください:
    
    -   Sitecore.XConnect.Client.dll
    -   Sitecore.XConnect.Collection.Model.dll
    -   Sitecore.XConnect.Core.dll
    -   Sitecore.XConnect.dll
    -   Sitecore.Xdb.Common.Web.dll
5.  **OK**をクリックします。
    
6.  Solution Explorerで **「References** 」を右クリックし、「 **Manage NuGet Packages**」をクリックします。
    
7.  **NuGet**ウィンドウで「**ブラウズ**」をクリックし、以下の参照を追加してください:
    
    -   Microsoft.Extensions.Configuration.Abstractions
    -   System.Interactive.Async.Providers
8.  Solution ExplorerでConsole.Journey/Program.csファイルをダブルクリックします。
    
9.  Program.csファイルでは、内容を以下のコードに置き換えます:
    
    using Sitecore.XConnect;
    using Sitecore.XConnect.Client;
    using Sitecore.XConnect.Client.WebApi;
    using Sitecore.XConnect.Collection.Model;
    using Sitecore.XConnect.Schema;
    using Sitecore.Xdb.Common.Web;
    using SitecoreCinema.Model.Collection;
    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    
    namespace SitecoreCinema.Console.Journey
    {
     public class Program
     {
     // From <xConnect instance>\\App\_Config\\AppSettings.config
     const string CERTIFICATE\_OPTIONS =
     "StoreName=My;StoreLocation=LocalMachine;FindType=FindByThumbprint;FindValue=???";
    
     // From your installation
     const string XCONNECT\_URL = "https://???XConnect.local";
    
     const string CONTACT\_ID = "L94564543543543534";
     const int CINEMA\_ID = 22;
     const string CONTACT\_ID\_SOURCE = "SitecoreCinema";
    
     public static string Identifier { get; set; }
    
     private static void Main(string args)
     {
    
     // Welcome to
     // \_\_\_\_\_ \_ \_\_ \_\_\_\_\_\_\_
     // / \_\_\_/(\_) /\_\_\_\_ \_\_\_\_\_\_\_\_\_ \_\_\_\_\_\_\_\_ / \_\_\_\_(\_)\_\_\_ \_\_\_ \_\_\_\_ \_\_\_ \_\_\_\_ \_
     // \\\_\_ \\/ / \_\_/ \_ \\/ \_\_\_/ \_\_ \\/ \_\_\_/ \_ \\/ / / / \_\_ \\/ \_ \\/ \_\_ \`\_\_ \\/ \_\_ \`/
     // \_\_\_/ / / /\_/ \_\_/ /\_\_/ /\_/ / / / \_\_/ /\_\_\_/ / / / / \_\_/ / / / / / /\_/ /
     // \_\_\_\_/\_/\\\_\_/\\\_\_\_/\\\_\_\_/\\\_\_\_\_/\_/ \\\_\_\_/\\\_\_\_\_/\_/\_/ /\_/\\\_\_\_/\_/ /\_/ /\_/\\\_\_,\_/
    
     // \_\_\_\_ \_ \_
     // | \_ \\ \_\_\_ \_\_ \_(\_)\_\_\_| |\_ \_\_\_ \_ \_\_
     // | |\_) / \_ \\/ \_\` | / \_\_| \_\_/ \_ \\ '\_\_|
     // | \_ < \_\_/ (\_| | \\\_\_ \\ || \_\_/ |
     // |\_| \\\_\\\_\_\_|\\\_\_, |\_|\_\_\_/\\\_\_\\\_\_\_|\_|
     // |\_\_\_/
    
     // You decide to register for the loyalty card scheme on the Sitecore Cinema website.
     // Apparently you get free popcorn for every 10 times you swipe your loyalty card.
    
     Task.Run(async () => { await Register(); }).Wait();
    
     // \_\_\_ \_ \_ \_ \_ \_ \_
     // |\_ \_|\_ \_\_ | |\_ \_\_\_ \_ \_\_ \_\_ \_ \_\_\_| |\_(\_) \_\_\_ \_ \_\_ \_| || |\_/ |
     // | || '\_ \\| \_\_/ \_ \\ '\_\_/ \_ |/ \_\_| \_\_| |/ \_ \\| '\_ \\|\_ .. \_| |
     // | || | | | || \_\_/ | | (\_| | (\_\_| |\_| | (\_) | | | |\_ \_| |
     // |\_\_\_|\_| |\_|\\\_\_\\\_\_\_|\_| \\\_\_,\_|\\\_\_\_|\\\_\_|\_|\\\_\_\_/|\_| |\_| |\_||\_| |\_|
    
     // You visit a Sitecore Cinema and buy a movie ticket in the self service machine.
     // You swipe your loyalty card, and the machine sends the interaction to xConnect.
     // Because you are a loyalty card member, you do not pay at this point.
    
     Task.Run(async () => { await SelfServiceMachine(); }).Wait();
    
     // \_\_\_ \_ \_ \_ \_ \_ \_\_\_\_
     // |\_ \_|\_ \_\_ | |\_ \_\_\_ \_ \_\_ \_\_ \_ \_\_\_| |\_(\_) \_\_\_ \_ \_\_ \_| || ||\_\_\_ \\
     // | || '\_ \\| \_\_/ \_ \\ '\_\_/ \_ |/ \_\_| \_\_| |/ \_ \\| '\_ \\|\_ .. \_|\_\_) |
     // | || | | | || \_\_/ | | (\_| | (\_\_| |\_| | (\_) | | | |\_ \_/ \_\_/
     // |\_\_\_|\_| |\_|\\\_\_\\\_\_\_|\_| \\\_\_,\_|\\\_\_\_|\\\_\_|\_|\\\_\_\_/|\_| |\_| |\_||\_||\_\_\_\_\_|
    
     // You buy some candy.
     // You swipe your loyalty card, and the machine sends the interaction to xConnect.
    
     Task.Run(async () => { await BuyCandy(); }).Wait();
    
     // \_\_\_ \_ \_ \_ \_ \_ \_\_\_\_\_
     // |\_ \_|\_ \_\_ | |\_ \_\_\_ \_ \_\_ \_\_ \_ \_\_\_| |\_(\_) \_\_\_ \_ \_\_ \_| || ||\_\_\_ /
     // | || '\_ \\| \_\_/ \_ \\ '\_\_/ \_ |/ \_\_| \_\_| |/ \_ \\| '\_ \\|\_ .. \_||\_ \\
     // | || | | | || \_\_/ | | (\_| | (\_\_| |\_| | (\_) | | | |\_ \_|\_\_) |
     // |\_\_\_|\_| |\_|\\\_\_\\\_\_\_|\_| \\\_\_,\_|\\\_\_\_|\\\_\_|\_|\\\_\_\_/|\_| |\_| |\_||\_||\_\_\_\_/
    
     // You scan your ticket and head into the movie theater.
     // Your loyalty card details are embedded in the barcode of your ticket.
     // At this point, the system takes payment.
    
     Task.Run(async () => { await WatchAMovie(); }).Wait();
    
     System.Console.ForegroundColor = ConsoleColor.DarkGreen;
     System.Console.WriteLine("");
     System.Console.WriteLine("END OF PROGRAM.");
     System.Console.ReadKey();
     }
    
     private static async Task Register()
     {
     CertificateHttpClientHandlerModifierOptions options =
     CertificateHttpClientHandlerModifierOptions.Parse(CERTIFICATE\_OPTIONS);
    
     var certificateModifier = new CertificateHttpClientHandlerModifier(options);
    
     List<IHttpClientModifier> clientModifiers = new List<IHttpClientModifier>();
     var timeoutClientModifier = new TimeoutHttpClientModifier(new TimeSpan(0, 0, 20));
     clientModifiers.Add(timeoutClientModifier);
    
     var collectionClient = new CollectionWebApiClient(
     new Uri(XCONNECT\_URL + "/odata"),
     clientModifiers,
     new { certificateModifier }
     );
    
     var searchClient = new SearchWebApiClient(
     new Uri(XCONNECT\_URL + "/odata"),
     clientModifiers,
     new { certificateModifier }
     );
    
     var configurationClient = new ConfigurationWebApiClient(
     new Uri(XCONNECT\_URL + "/configuration"),
     clientModifiers,
     new { certificateModifier }
     );
    
     var cfg = new XConnectClientConfiguration(
     new XdbRuntimeModel(CollectionModel.Model, SitecoreCinemaModel.Model),
     collectionClient,
     searchClient,
     configurationClient
     );
    
     try
     {
     await cfg.InitializeAsync();
    
     // Print "Register" if configuration is valid
     var arr = new
     {
     @" \_\_\_\_ \_ \_ ",
     @" | \_ \\ \_\_\_ \_\_ \_(\_)\_\_\_| |\_ \_\_\_ \_ \_\_ ",
     @" | |\_) / \_ \\/ \_\` | / \_\_| \_\_/ \_ \\ '\_\_| ",
     @" | \_ < \_\_/ (\_| | \\\_\_ \\ || \_\_/ | ",
     @" |\_| \\\_\\\_\_\_|\\\_\_, |\_|\_\_\_/\\\_\_\\\_\_\_|\_| ",
     @" |\_\_\_/ ",
     };
     System.Console.WindowWidth = 160;
     foreach (string line in arr)
     System.Console.WriteLine(line);
     System.Console.WriteLine();
     }
     catch (XdbModelConflictException ce)
     {
     System.Console.WriteLine("ERROR:" + ce.Message);
     return;
     }
    
     // Initialize a client using the validated configuration
     using (var client = new XConnectClient(cfg))
     {
     try
     {
     ContactIdentifier identifier = new ContactIdentifier(
     CONTACT\_ID\_SOURCE,
     CONTACT\_ID + Guid.NewGuid(),
     ContactIdentifierType.Known
     );
    
     System.Console.WriteLine("We will generate an loyalty member ID for you and print it on a loyalty card.");
     System.Console.WriteLine(
     "Alright, your loyalty member ID is "
     + identifier.Identifier
     + ". Congratulations!"
     );
    
     Identifier = identifier.Identifier;
     Contact contact = new Contact(new ContactIdentifier { identifier });
    
     System.Console.WriteLine("What is your first name?");
     var firstname = System.Console.ReadLine();
    
     System.Console.WriteLine("What is your last name?");
     var lastname = System.Console.ReadLine();
    
     PersonalInformation personalInfo = new PersonalInformation()
     {
     FirstName = firstname,
     LastName = lastname
     };
    
     System.Console.WriteLine("What is your favourite movie?");
     var favouriteMovie = System.Console.ReadLine();
    
     CinemaVisitorInfo visitorInfo = new CinemaVisitorInfo()
     {
     FavoriteMovie = favouriteMovie
     };
    
     client.AddContact(contact);
     client.SetFacet<CinemaVisitorInfo>(contact, CinemaVisitorInfo.DefaultFacetKey, visitorInfo);
     client.SetFacet<PersonalInformation>(contact, PersonalInformation.DefaultFacetKey, personalInfo);
    
     var offlineChannel = Guid.NewGuid();
     var registrationGoalId = Guid.NewGuid();
    
     Interaction interaction = new Interaction(
     contact,
     InteractionInitiator.Brand,
     offlineChannel,
     String.Empty
     );
    
     interaction.Events.Add(new Goal(registrationGoalId, DateTime.UtcNow));
     client.AddInteraction(interaction);
     await client.SubmitAsync();
     System.Console.WriteLine("Great! See you at the movies. Press any key to go to a Sitecore Cinema.");
     System.Console.ReadKey();
     }
     catch (XdbExecutionException ex)
     {
     // Deal with exception
     }
     }
     }
    
     private static async Task SelfServiceMachine()
     {
     CertificateHttpClientHandlerModifierOptions options =
     CertificateHttpClientHandlerModifierOptions.Parse(CERTIFICATE\_OPTIONS);
    
     var certificateModifier = new CertificateHttpClientHandlerModifier(options);
     List<IHttpClientModifier> clientModifiers = new List<IHttpClientModifier>();
     var timeoutClientModifier = new TimeoutHttpClientModifier(new TimeSpan(0, 0, 20));
     clientModifiers.Add(timeoutClientModifier);
    
     var collectionClient = new CollectionWebApiClient(
     new Uri(XCONNECT\_URL + "/odata"),
     clientModifiers,
     new { certificateModifier }
     );
    
     var searchClient = new SearchWebApiClient(
     new Uri(XCONNECT\_URL + "/odata"),
     clientModifiers,
     new { certificateModifier }
     );
    
     var configurationClient = new ConfigurationWebApiClient(
     new Uri(XCONNECT\_URL + "/configuration"),
     clientModifiers,
     new { certificateModifier }
     );
    
     var cfg = new XConnectClientConfiguration(
     new XdbRuntimeModel(CollectionModel.Model, SitecoreCinemaModel.Model),
     collectionClient,
     searchClient,
     configurationClient
     );
    
     try
     {
     await cfg.InitializeAsync();
    
     // Print "Ticket" if configuration is valid
     var arr = new
     {
     @" \_\_\_\_\_ \_ \_ \_ ",
     @"|\_ \_(\_) \_\_\_| | \_\_\_\_\_| |\_ ",
     @" | | | |/ \_\_| |/ / \_ \\ \_\_|",
     @" | | | | (\_\_| < \_\_/ |\_ ",
     @" |\_| |\_|\\\_\_\_|\_|\\\_\\\_\_\_|\\\_\_|",
     };
     System.Console.WindowWidth = 160;
     foreach (string line in arr)
     System.Console.WriteLine(line);
     System.Console.WriteLine();
     }
     catch (XdbModelConflictException ce)
     {
     System.Console.WriteLine("ERROR:" + ce.Message);
     return;
     }
    
     // Initialize a client using the validated configuration
     using (var client = new XConnectClient(cfg))
     {
     try
     {
     System.Console.ForegroundColor = ConsoleColor.Cyan;
     System.Console.WriteLine("You swipe your loyalty card.");
     System.Console.ForegroundColor = ConsoleColor.White;
    
     var identifier = new IdentifiedContactReference(CONTACT\_ID\_SOURCE, Identifier);
    
     var contact = await client.GetAsync<Contact>(
     identifier,
     new ContactExpandOptions(
     PersonalInformation.DefaultFacetKey,
     CinemaVisitorInfo.DefaultFacetKey)
     );
    
     if (contact != null)
     {
     var personalInfo = contact.GetFacet<PersonalInformation>();
     var cinemaInfo = contact.GetFacet<CinemaVisitorInfo>();
    
     System.Console.WriteLine(
     "Hello "
     + personalInfo.FirstName
     + " "
     + personalInfo.LastName
     + ". I see that your favorite film is "
     + cinemaInfo.FavoriteMovie
     + ". We might play that soon. Check our website or sign up for our newsletter."
     );
    
     var interaction = new Interaction(
     contact,
     InteractionInitiator.Contact,
     Guid.NewGuid(), // The GUID should match a Sitecore channel item id
     ""
     );
    
     client.SetFacet<CinemaInfo>(
     interaction,
     CinemaInfo.DefaultFacetKey,
     new CinemaInfo() { CinemaId = CINEMA\_ID }
     );
    
     interaction.Events.Add(new UseSelfService(DateTime.UtcNow));
     client.AddInteraction(interaction);
     await client.SubmitAsync();
     System.Console.WriteLine("Here is your ticket. We will charge you when you use it, in case you have some sort of emergency between here and the theater ;-)");
     System.Console.WriteLine("It is just one of those courtesies we offer loyalty card members! Press any key to buy some candy.");
     System.Console.ReadKey();
     }
     }
     catch (XdbExecutionException ex)
     {
     // Deal with exception
     }
     }
    
     }
     private static async Task BuyCandy()
     {
     CertificateHttpClientHandlerModifierOptions options =
     CertificateHttpClientHandlerModifierOptions.Parse(CERTIFICATE\_OPTIONS);
    
     var certificateModifier = new CertificateHttpClientHandlerModifier(options);
     List<IHttpClientModifier> clientModifiers = new List<IHttpClientModifier>();
     var timeoutClientModifier = new TimeoutHttpClientModifier(new TimeSpan(0, 0, 20));
     clientModifiers.Add(timeoutClientModifier);
    
     var collectionClient = new CollectionWebApiClient(
     new Uri(XCONNECT\_URL + "/odata"),
     clientModifiers,
     new { certificateModifier }
     );
    
     var searchClient = new SearchWebApiClient(
     new Uri(XCONNECT\_URL + "/odata"),
     clientModifiers,
     new { certificateModifier }
     );
    
     var configurationClient = new ConfigurationWebApiClient(
     new Uri(XCONNECT\_URL + "/configuration"),
     clientModifiers,
     new { certificateModifier }
     );
    
     var cfg = new XConnectClientConfiguration(
     new XdbRuntimeModel(CollectionModel.Model, SitecoreCinemaModel.Model),
     collectionClient,
     searchClient,
     configurationClient
     );
    
     try
     {
     await cfg.InitializeAsync();
    
     // Print "Candy" if configuration is valid
     var arr = new
     {
     @" \_\_\_\_ \_ ",
     @" / \_\_\_|\_\_ \_ \_ \_\_ \_\_| |\_ \_ ",
     @"| | / \_\` | '\_ \\ / \_\` | | | |",
     @"| |\_\_| (\_| | | | | (\_| | |\_| |",
     @" \\\_\_\_\_\\\_\_,\_|\_| |\_|\\\_\_,\_|\\\_\_, |",
     @" |\_\_\_/ ",
     };
     System.Console.WindowWidth = 160;
     foreach (string line in arr)
     System.Console.WriteLine(line);
     System.Console.WriteLine();
     }
     catch (XdbModelConflictException ce)
     {
     System.Console.WriteLine("ERROR:" + ce.Message);
     return;
     }
    
     // Initialize a client using the validated configuration
     using (var client = new XConnectClient(cfg))
     {
     try
     {
     System.Console.ForegroundColor = ConsoleColor.Cyan;
     System.Console.WriteLine("You swipe your loyalty card.");
     System.Console.ForegroundColor = ConsoleColor.White;
    
     var identifier = new IdentifiedContactReference(CONTACT\_ID\_SOURCE, Identifier);
    
     var contact = await client.GetAsync<Contact>(
     identifier,
     new ContactExpandOptions(
     PersonalInformation.DefaultFacetKey,
     CinemaVisitorInfo.DefaultFacetKey
     )
     );
    
     if (contact != null)
     {
     var personalInfo = contact.GetFacet<PersonalInformation>();
     var cinemaInfo = contact.GetFacet<CinemaVisitorInfo>();
    
     System.Console.WriteLine("Hello again " + personalInfo.FirstName + ".");
     System.Console.WriteLine("Candy? You got it.");
    
     var interaction = new Interaction(
     contact,
     InteractionInitiator.Contact,
     Guid.NewGuid(), // The GUID should match a Sitecore channel item id
     ""
     );
    
     client.SetFacet<CinemaInfo>(
     interaction,
     CinemaInfo.DefaultFacetKey,
     new CinemaInfo() { CinemaId = CINEMA\_ID }
     );
    
     interaction.Events.Add(new BuyConcessions(DateTime.UtcNow, "DKK", 150m));
     client.AddInteraction(interaction);
     await client.SubmitAsync();
     System.Console.WriteLine("Enjoy the movie! Press any key to go to the movie theater.");
     System.Console.ReadKey();
     }
     }
     catch (XdbExecutionException ex)
     {
     // Deal with exception
     }
     }
     }
    
     private static async Task WatchAMovie()
     {
     CertificateHttpClientHandlerModifierOptions options =
     CertificateHttpClientHandlerModifierOptions.Parse(CERTIFICATE\_OPTIONS);
    
     var certificateModifier = new CertificateHttpClientHandlerModifier(options);
     List<IHttpClientModifier> clientModifiers = new List<IHttpClientModifier>();
     var timeoutClientModifier = new TimeoutHttpClientModifier(new TimeSpan(0, 0, 20));
     clientModifiers.Add(timeoutClientModifier);
    
     var collectionClient = new CollectionWebApiClient(
     new Uri(XCONNECT\_URL + "/odata"),
     clientModifiers,
     new { certificateModifier }
     );
    
     var searchClient = new SearchWebApiClient(
     new Uri(XCONNECT\_URL + "/odata"),
     clientModifiers,
     new { certificateModifier }
     );
    
     var configurationClient = new ConfigurationWebApiClient(
     new Uri(XCONNECT\_URL + "/configuration"),
     clientModifiers,
     new { certificateModifier }
     );
    
     var cfg = new XConnectClientConfiguration(
     new XdbRuntimeModel(CollectionModel.Model, SitecoreCinemaModel.Model),
     collectionClient,
     searchClient,
     configurationClient
     );
    
     try
     {
     await cfg.InitializeAsync();
    
     // Print "Movie" if configuration is valid
     var arr = new
     {
     @" \_\_ \_\_ \_ ",
     @"| \\/ | \_\_\_\_\_ \_(\_) \_\_\_ ",
     @"| |\\/| |/ \_ \\ \\ / / |/ \_ \\",
     @"| | | | (\_) \\ V /| | \_\_/",
     @"|\_| |\_|\\\_\_\_/ \\\_/ |\_|\\\_\_\_|",
    
     };
     System.Console.WindowWidth = 160;
     foreach (string line in arr)
     System.Console.WriteLine(line);
     System.Console.WriteLine();
     }
     catch (XdbModelConflictException ce)
     {
     System.Console.WriteLine("ERROR:" + ce.Message);
     return;
     }
    
     // Initialize a client using the validated configuration
     using (var client = new XConnectClient(cfg))
     {
     try
     {
     System.Console.ForegroundColor = ConsoleColor.Cyan;
     System.Console.WriteLine("You scan your ticket which has your loyalty member information embedded in its bar code.");
     System.Console.ForegroundColor = ConsoleColor.White;
    
     var identifier = new IdentifiedContactReference(CONTACT\_ID\_SOURCE, Identifier);
    
     var contact = await client.GetAsync<Contact>(
     identifier,
     new ContactExpandOptions(
     PersonalInformation.DefaultFacetKey,
     CinemaVisitorInfo.DefaultFacetKey
     )
     );
    
     if (contact != null)
     {
     var personalInfo = contact.GetFacet<PersonalInformation>();
     var cinemaInfo = contact.GetFacet<CinemaVisitorInfo>();
    
     System.Console.WriteLine("Enjoy your movie, " + personalInfo.FirstName + "!");
     System.Console.WriteLine("Since you are a loyalty member, we will take payment for your ticket now.");
    
     var interaction = new Interaction(
     contact,
     InteractionInitiator.Contact,
     Guid.NewGuid(), // The GUID should match a Sitecore channel item id
     ""
     );
    
     interaction.Events.Add(
     new WatchMovie(DateTime.UtcNow, "DKK", 100m) { EIDR = "10.5240/08B0-F8C2-5525-BF22-BA07-4" }
     );
    
     client.SetFacet<CinemaInfo>(
     interaction,
     CinemaInfo.DefaultFacetKey,
     new CinemaInfo() { CinemaId = CINEMA\_ID }
     );
    
     client.AddInteraction(interaction);
     await client.SubmitAsync();
     System.Console.WriteLine("Before you go! Do you want to see the data we have collected about you today? :)");
    
     var contactAgain = await client.GetAsync<Contact>(
     identifier,
     new ContactExpandOptions(
     PersonalInformation.DefaultFacetKey,
     CinemaVisitorInfo.DefaultFacetKey
     )
     {
     Interactions = new RelatedInteractionsExpandOptions(
     new string { CinemaInfo.DefaultFacetKey }
     )
     {
     StartDateTime = DateTime.Today
     }
     }
     );
    
     if (contactAgain != null)
     {
     var details = contactAgain.GetFacet<PersonalInformation>();
     var movie = contactAgain.GetFacet<CinemaVisitorInfo>();
    
     System.Console.WriteLine(String.Format(
     "Your name is {0} {1}, and your favorite movie is {2}.",
     details.FirstName,
     details.LastName,
     movie.FavoriteMovie
     ));
    
     System.Console.WriteLine(
     "Today you have had "
     + contactAgain.Interactions.Count
     + " interactions with us."
     );
    
     var i = 0;
    
     foreach (var interactionsToday in contactAgain.Interactions)
     {
     i++;
     var cinemaId = interactionsToday.GetFacet<CinemaInfo>(CinemaInfo.DefaultFacetKey);
     System.Console.WriteLine("");
    
     System.Console.WriteLine(
     "Interaction #"
     + i
     + (cinemaId != null ? " at Cinema #" + cinemaId.CinemaId : String.Empty)
     );
    
     System.Console.Write("Events: ");
    
     foreach (var evv in interactionsToday.Events) {
     System.Console.Write(evv.GetType().ToString() + "");
     };
    
     System.Console.WriteLine("");
     }
     }
    
     System.Console.ReadKey();
     }
     }
     catch (XdbExecutionException ex)
     {
     // Deal with exception
     }
     }
     }
     }
    }
    
10.  CERTIFICATE\_THUMBPRINTとXCONNECT\_URL定数を編集してください。
     
11.  Program.csファイルを保存してください。
     

## Sitecoreシネマ訪問をシミュレートする

Sitecoreシネマをシミュレートするには、以下の訪問をしてください:

1.  管理者権限でVisual Studio、Solution ExplorerでConsole.Journeyプロジェクトを右クリックし、「 **スタートアッププロジェクトとして設定**」をクリックします。
    
2.  **「スタート**」をクリックしてConsole.Journeyアプリを実行し、次の動作を待つことができます:
    
    -   名前を登録してください。
    -   セカンドネームを登録してください。
    -   お気に入りの映画を登録しましょう。
    -   映画のチケットを買うシミュレーションをしましょう。
    -   キャンディを買うシミュレーションをします。
    -   映画館に入ることをシミュレートします。
    -   収集した連絡先情報とやり取りを提示してください。
    
    ![A terminal with the membership registration details in the app output.](https://doc.sitecore.com/api/markdown-image/xp/ja/developers/93/sitecore-experience-platform/images/xconn-tut5-code2.png)