Fermer

février 25, 2020

Le processus de mappage des données avec Sitecore Data Exchange Framework


Le Framework d'échange de données Sitecore permet de synchroniser les données entre deux systèmes disparates, dont aucun n'a besoin d'être réellement Sitecore. La modélisation du mappage de données est gérée dans l'arborescence de contenu de Sitecore, cependant, le processus peut impliquer deux systèmes que vous configurez.

Lors du mappage de champs, il existe un certain processus par lequel un champ passe:

 Diagramme de mappage de Sitecore

Comme vous pouvez le voir, il existe plusieurs possibilités pour vous de transformer les valeurs de données via le processus de mappage. Si vous écrivez un fournisseur personnalisé, une chose importante est de reconnaître tous les différents types de données qui vont passer par ce processus. Par exemple, si ma valeur de données source est une chaîne de date (MM / jj / aaaa) et ma valeur de données cible est une autre chaîne de date dans un format différent (aaaa-MM-jj), où l'analyse de la chaîne de date source a-t-elle lieu dans un objet DateTime et où le formatage ToString () se trouve-t-il écrit dans la chaîne de date cible? Doit-il même être converti en objet C # pendant le processus? Ou la chaîne nécessite-t-elle simplement une manipulation? Ce sont des considérations qui devront être prises en compte pour déterminer comment modéliser vos processus de transformation de données.

Bien que ce soit le processus que DEF vous offre, puisque DEF est si extensible, vous avez la possibilité d'ajouter encore plus d'étapes pour une transformation possible dans ce pipeline. Par exemple, les accesseurs de valeur du fournisseur Sitecore fournissent des champs supplémentaires pour sélectionner Lecteurs de valeur pour effectuer la transformation après la lecture d'un élément Sitecore ainsi qu'avant l'écriture des données dans un élément Sitecore. Cela se traduit par un processus qui ressemble à ceci:

Sitecore en tant que données source

 Diagramme de mappage - Sitecore en tant que données source

Sitecore en tant que données cible

 Diagramme de mappage - Sitecore en tant que cible Données

Ces champs supplémentaires fournissent plus de points d'extension pour transformer les données dans le pipeline qui sont directement associées aux accesseurs de valeur . Les accesseurs de valeur personnalisée peuvent également en profiter – le convertisseur devra lire dans un champ Droptree sur le modèle et passer la propriété correspondante IValueReader en tant que propriété lors de l'instanciation du lecteur ou en tant que un paramètre constructeur. Un exemple rapide de code définitivement pas prêt à la production de ce à quoi cela ressemble:

 // SampleValueAccessorConverter.cs

[SupportedIds(SampleValueAccessorTemplateId)]
classe public SampleValueAccessorConverter: ValueAccessorConverter
{
  chaîne de const publique SampleValueAccessorTemplateId = "{0000000-0000-0000-0000-0000000000000}";
  public SampleValueAccessorConverter (référentiel IItemModelRepository): base (référentiel)
    {
    }

  remplacement prioritaire IValueReader GetValueReader (source ItemModel)
    {
    // crée une nouvelle instance de notre lecteur de valeur
    renvoyer un nouveau SampleValueReader
    {
      // passez l'élément qui se trouve dans le champ ReaderValueTransformer (à partir de votre modèle d'accesseur de valeur)
      ValueTransformer = this.ConvertReferenceToModel (source, "ReaderValueTransformer");
    };
  }

  remplacement prioritaire IValueWriter GetValueWriter (source ItemModel)
    {
    // crée une nouvelle instance de notre rédacteur de valeur
    renvoyer un nouveau SampleValueWriter
    {
      // passez l'élément qui se trouve dans le champ WriterValueTransformer (à partir de votre modèle d'accesseur de valeur)
      ValueTransformer = this.ConvertReferenceToModel (source, "WriterValueTransformer");
    };
  }
} 
 // SampleValueReader.cs

Classe public class SampleValueReader: IValueReader
{
  // propriété remplie par le convertisseur d'accesseur de valeur
  public IValueReader ValueTransformer {get; ensemble; }

  public ReadResult Read (source d'objet, contexte DataAccessContext)
    {
    var readResult = nouveau ReadResult (DateTime.UtcNow)
    {
      WasValueRead = false
    };

    // effectuer des opérations de transformation
    var transformValue = Transform (source);

    // définit la valeur transformée comme valeur à renvoyer
    readResult.ReadValue = transformValue;
    readResult.WasValueRead = true;

    return readResult;
  }
} 
 // SampleValueWriter.cs

public class SampleValueWriter: IValueWriter
{
  // propriété remplie par le convertisseur d'accesseur de valeur
  public IValueReader ValueTransformer {get; ensemble; }

  public virtual bool Write (cible d'objet, valeur d'objet, contexte DataAccessContext)
    {
    // si un transformateur est défini, exécutez-le
    if (this.ValueTransformer! = null)
    {
      var readResult = this.ValueTransformer.Read (value, new DataAccessContext ());
      // si la transformation a réussi, définissez le résultat de la transformation comme valeur à la place
      value = readResult.WasValueRead? readResult.ReadValue: valeur;
    }

    // faire des opérations d'écriture
    WriteToSomething (valeur);

    return true;
  }
} 






Source link