チュートリアル: カスタム ファセットとイベントの作成

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

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

このチュートリアルは、xConnectコレクション モデルの拡張チュートリアル シリーズのパート5です。このチュートリアルを完了するには、まずチュートリアル パート123および4を完了する必要があります。

このチュートリアルでは、Sitecore Cinemaを使用し、訪問者から情報を収集するためにコレクション モデルを拡張する必要があります。この情報は、訪問者が映画館の1つとやり取りするたびにポイントカードをスワイプすることに依存しており、訪問のインセンティブとして、ポイントカードを10回使用すると無料のポップコーンを提供します。

このチュートリアルでは、次の方法について説明します。

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

  • CinemaInfoインタラクションファセットクラスの作成

  • CinemaVisitorInfoコンタクト ファセット クラスを作成する

  • WatchMovie結果項目を作成する

  • WatchMovie結果クラスを作成する

  • BuyConcessions結果項目を作成する

  • BuyConcessions結果クラスを作成する

  • UseSelfServiceイベントアイテムを作成する

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

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

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

  • SitecoreCinemaModelコレクションモデルをシリアル化する

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

  • Sitecore Cinemaの訪問をシミュレートする

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

SitecoreCinemaソリューションとクラス ライブラリ プロジェクトを作成するには、次のようにします。

  1. Visual Studioで、管理者特権を使用して、.NET Framework用の新しいソリューションとクラス ライブラリ プロジェクトを作成します ( SitecoreCinema)。

    The Configure your new project dialogue box in Visual Studio.
  2. ソリューション エクスプローラーで、SitecoreCinema/Referencesを右クリックし、Add Referenceをクリックします。

  3. Reference Managerウィンドウで、「Browse」をクリックし、<xConnect instance>\bin\フォルダから次の参照を追加します。

    • Sitecore.XConnect.Collection.Model.dll

    • Sitecore.XConnect.Core

    • Sitecore.XConnect.dll

  4. OK」をクリックします。

CinemaInfoインタラクション ファセット クラスを作成する

CinemaInfoクラスは、インタラクション中に訪れた映画館に関する情報を含むインタラクションファセットです。

CinemaInfoインタラクションファセットクラスを作成するには:

  1. Visual Studioで管理者特権を持つソリューション エクスプローラーで、SitecoreCinemaプロジェクトを右クリックし、AddNew Itemの順にクリックします。

  2. Add New Itemウィンドウで、次の操作を行います。

    • 左側のウィンドウで、Installed/Visual C# Itemsをクリックします。

    • 中央のウィンドウで、Classをクリックします。

    • 下部のNameフィールドに「 CinemaInfo.cs 」と入力し、Addをクリックします。

  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で管理者特権を持つソリューション エクスプローラーで、SitecoreCinemaプロジェクトを右クリックし、AddNew Itemの順にクリックします。

  2. Add New Itemウィンドウで、次の操作を行います。

    • 左側のウィンドウで、Installed/Visual C# Itemsをクリックします。

    • 中央のウィンドウで、Classをクリックします。

    • 下部のNameフィールドに「 CinemaVisitorInfo.cs 」と入力し、Addをクリックします。

  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. Optionsパネルで、Outcome Definitionをクリックします。

  3. Messageウィンドウで、「WatchMovie」と入力し、「OK」をクリックします。

  4. Quick Infoセクションで、アイテムIDをメモします。

WatchMovie結果クラスを作成する

WatchMovie結果クラスは、訪問者が映画のチケットを購入したときに、POSシステムからWatchMovie結果アイテムをトリガーします。

WatchMovie結果クラスを作成するには、次のようにします。

  1. Visual Studioで管理者特権を持つソリューション エクスプローラーで、SitecoreCinemaプロジェクトを右クリックし、AddNew Itemの順にクリックします。

  2. Add New Itemウィンドウで、次の操作を行います。

    • 左側のウィンドウで、Installed/Visual C# Itemsをクリックします。

    • 中央のウィンドウで、Classをクリックします。

    • 下部のNameフィールドに「 WatchMovie.cs 」と入力し、Addをクリックします。

  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. Optionsパネルで、Outcome Definitionをクリックします。

  3. Messageウィンドウで、「BuyConcessions」と入力し、「OK」をクリックします。

  4. Quick Infoセクションで、アイテムIDをメモします。

BuyConcessions結果クラスを作成する

BuyConcessions結果クラスは、訪問者が割引を購入するときに、POSシステムからBuyConcessions結果アイテムをトリガーします。

BuyConcessions結果クラスを作成するには、次のようにします。

  1. Visual Studioで管理者特権を持つソリューション エクスプローラーで、SitecoreCinemaプロジェクトを右クリックし、AddNew Itemの順にクリックします。

  2. Add New Itemウィンドウで、次の操作を行います。

    • 左側のウィンドウで、Installed/Visual C# Itemsをクリックします。

    • 中央のウィンドウで、Classをクリックします。

    • 下部のNameフィールドに「 BuyConcessions.cs 」と入力し、Addをクリックします。

  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. Optionsパネルで、Eventをクリックします。

  3. Messageウィンドウで、「UseSelfService」と入力し、「OK」をクリックします。

  4. Quick Infoセクションで、アイテムIDをメモします。

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

UseSelfServiceイベント クラスは、訪問者が映画のチケットを購入すると、チケット マシンからUseSelfServiceイベント アイテムをトリガーします。

UseSelfServiceイベント・クラスを作成するには、次のようにします。

  1. Visual Studioで管理者特権を持つソリューション エクスプローラーで、SitecoreCinemaプロジェクトを右クリックし、AddNew Itemの順にクリックします。

  2. Add New Itemウィンドウで、次の操作を行います。

    • 左側のウィンドウで、Installed/Visual C# Itemsをクリックします。

    • 中央のウィンドウで、Classをクリックします。

    • 下部のNameフィールドに「 UseSelfService.cs 」と入力し、Addをクリックします。

  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で管理者特権を持つソリューション エクスプローラーで、SitecoreCinemaを右クリックし、AddNew Itemの順にクリックします。

  2. Add New Itemウィンドウで、次の操作を行います。

    • 左側のウィンドウで、Installed/Visual C# Itemsをクリックします。

    • 中央のウィンドウで、Classをクリックします。

    • 下部のNameフィールドに「 SitecoreCinemaModel.cs 」と入力し、Addをクリックします。

  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.Deployコンソール アプリは、SitecoreCinemaModelをJSON形式にシリアル化します。

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

  1. Visual Studioで管理者特権でSitecoreCinemaソリューションを右クリックし、AddをクリックしNew Project .NET Framework用の新しいコンソール アプリ プロジェクトを作成します。次の .NET Framework Console.Deploy

    The Configure your new project dialogue box in Visual Studio.
  2. ソリューション エクスプローラーで、Console.Deploy/Referencesを右クリックし、Add Referenceをクリックします。

  3. Reference ManagerウィンドウのProjectsタブで、SitecoreCinemaを選択します。

  4. Reference Managerウィンドウで、「Browse」をクリックし、<xConnect instance>\bin\フォルダから次の参照を追加します。

    • Sitecore.XConnect.Core.dll

    • Sitecore.XConnect.dll

  5. OK」をクリックします。

  6. ソリューション エクスプローラーで、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で管理者特権を持つソリューション エクスプローラーで、Console.Deployプロジェクトを右クリックし、Set as Startup Projectをクリックします。

  2. StartをクリックしてConsole.Deployアプリを実行し、モデルがシリアル化されるのを待ちます。

    A terminal with the model details in the app output.

    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 Cinemaでの訪問者の移動をシミュレートします。

  • 来場者は券売機で映画のチケットを購入します。

  • 客は売店でキャンディーを買います。

  • 訪問者は映画のチケットをスキャンして映画館に入ります。

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

  1. Visual Studioで管理者特権でSitecoreCinemaソリューションを右クリックし、AddをクリックしNew Project .NET Framework用の新しいコンソール アプリ プロジェクトを作成します。次の .NET Framework Console.Journey

    The Configure your new project dialogue box in Visual Studio.
  2. ソリューション エクスプローラーで、Console.Journey/Referencesを右クリックし、Add Referenceをクリックします。

  3. Reference ManagerウィンドウのProjectsタブで、SitecoreCinemaを選択します。

  4. Reference Managerウィンドウで、「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. ソリューション エクスプローラーで、Referencesを右クリックし、Manage NuGet Packagesをクリックします。

  7. NuGetウィンドウで、「Browse」をクリックし、次の参照を追加します。

    • Microsoft.Extensions.Configuration.Abstractions

    • System.Interactive.Async.Providers

  8. ソリューション エクスプローラーで、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 Cinemaの訪問をシミュレートする

Sitecore Cinemaの訪問をシミュレートするには:

  1. Visual Studioで管理者特権を持つソリューション エクスプローラーで、Console.Journeyプロジェクトを右クリックし、Set as Startup Projectをクリックします。

  2. StartをクリックしてConsole.Journeyアプリを実行し、次の操作が行われるのを待ちます。

    • 名を登録します。

    • セカンドネームを登録します。

    • お気に入りの映画を登録します。

    • 映画のチケットを買うシミュレーションをします。

    • キャンディーの購入をシミュレートします。

    • 映画館への入場をシミュレートします。

    • 収集された連絡先情報とインタラクションを表示します。

    A terminal with the membership registration details in the app output.
この記事を改善するための提案がある場合は、 お知らせください!