Create a contact processor
This topic demonstrates how to create and register your own contact processor.
Inherit ContactProcessingProcessor
All contact processors inherit from Sitecore.Analytics.Aggregation.Pipeline.ContactProcessingProcessor:
public class SampleProcessor : ContactProcessingProcessor
{
protected override void OnProcess(ContactProcessingArgs args)
{
}
}
Specify contact facets to retrieve
The processing pipeline uses the xConnect Client API to retrieve contacts. You must specify which contact facets to retrieve by decorating your processor with UsesContactFacets.
Example of usage:
[UsesContactFacets("Personal", "Classification")]
public class SampleProcessor : ContactProcessingProcessor
{
protected override void OnProcess(ContactProcessingArgs args)
{
}
}
It is recommended that you do not hard-code facet keys - Sitecore’s built-in facet names are located on the facet object itself - such as PersonalInformation.DefaultFacetKey.
[UsesContactFacets(PersonalInformation.DefaultFacetKey, Classification.DefaultFacetKey)]
public class SampleProcessor : ContactProcessingProcessor
{
}
If you do not explicitly request a particular facet, it will not be available during processing. To understand why, read more about the role of expand options when getting contacts.
Using ContactProcessingArgs
[UsesContactFacets(PersonalInformation.DefaultFacetKey, Classification.DefaultFacetKey)]
public class SampleProcessor : ContactProcessingProcessor
{
protected override void OnProcess(ContactProcessingArgs args)
{
}
}
Accessing the contact
The contact is available directly on the args:
[UsesContactFacets(PersonalInformation.DefaultFacetKey, Classification.DefaultFacetKey)]
public class SampleProcessor : ContactProcessingProcessor
{
protected override void OnProcess(ContactProcessingArgs args)
{
var contact = args.Contact;
}
}
If you requested any contact facets, they can be accessed via the .GetFacet<T> extension method:
var personalFacet = args.Contact.GetFacet<PersonalInformation>(PersonalInformation.DefaultFacetKey);
Alternatively, use the extension methods found in Sitecore.XConnect.Collection.Model:
var personalFacet = args.Contact.Personal();
Access processing reason
The args.ProcessingReason property returns an enum of type Sitecore.Analytics.Processing.ProcessingReason, which tells you why the contact is being processed in the first place.
-
Created: The contact is new -
Updated: The contact was updated -
Obsoleted: The contact identifier has been obsoleted -
Unknown: Reason for processing is unknown
Accessing other APIs
Every processor has access to the following APIs via args.Sources:
-
xConnect Client API
-
Reference Data Service
-
Defintion managers
-
Taxonomy managers
In the context of a contact processor, all service end points - xConnect, definitions, taxonomy, and the reference data service - should be treated as read-only.
Accessing xConnect
A read-only instance of the xConnect Client API is accessed via args.Sources.Collection. You can search or get contact data:
[UsesContactFacets(PersonalInformation.DefaultFacetKey, Classification.DefaultFacetKey)]
public class SampleProcessor : ContactProcessingProcessor
{
protected override void OnProcess(ContactProcessingArgs args)
{
// Searching
var contacts = args.Sources.Collection.Contacts.Where(x => x.Identifiers.Any(c => c.IdentifierType == ContactIdentifierType.Known));
}
}
Remember that the contact is available via args.Contact.
Accessing definition managers
[UsesContactFacets(PersonalInformation.DefaultFacetKey, Classification.DefaultFacetKey)]
public class SampleProcessor : ContactProcessingProcessor
{
protected override void OnProcess(ContactProcessingArgs args)
{
var goalManager = args.Sources.Definitions.GetDefinitionManager<IGoalDefinition>();
}
}
Accessing taxonomy managers
[UsesContactFacets(PersonalInformation.DefaultFacetKey, Classification.DefaultFacetKey)]
public class SampleProcessor : ContactProcessingProcessor
{
protected override void OnProcess(ContactProcessingArgs args)
{
var assetTaxonomyManager = args.Sources.Taxonomies.GetManager<AssetTaxonomyManager>();
}
}
Accessing the reference data service
[UsesContactFacets(PersonalInformation.DefaultFacetKey, Classification.DefaultFacetKey)]
public class SampleProcessor : ContactProcessingProcessor
{
protected override void OnProcess(ContactProcessingArgs args)
{
var definitionType = args.Sources.Reference.EnsureDefinitionType("alpha");
var criteria = new DefinitionCriteria("enterprise", definitionType)
{
Culture = new CultureInfo("da")
};
Definition<string, string> definition = args.Sources.Reference.GetDefinition<string, string>(criteria, true);
}
}
The contact processing pipeline uses a read only version of the reference data service API - it does not use the client API.
Configuring a contact processor
Add your processor to the contact processing pipeline as shown:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<sitecore>
<pipelines>
<group groupName="analytics.aggregation">
<pipelines>
<contacts>
<processor type="Sitecore.Analytics.Aggregation.Tests.Processors.FakeContactProcessingProcessor, Sitecore.Analytics.Aggregation.Tests" />
</contacts>
</pipelines>
</group>
</pipelines>
</sitecore>
</configuration>