Boite à outils Office

Linq pour CommerceServer : merci CSMetal !

Commerce Server, Développement Add comments

Il y a déjà quelques semaines, Kerry Havas, Architecte Produit Commerce Server, a publié la version 2 de CSMetal.

Qu’est-ce que CSMetal ? C’est un utilitaire pour Commerce Server qui génère des classes fortement typées utilisable à travers un provider LINQ basé sur l’API Commerce Foundation => ie, ça ne remplace pas l’API Commerce Foundation !

Kerry frappe fort avec CSMetal, car le développement sous Commerce Server devient un “jeu d’enfant”!

Avant de pouvoir utiliser le provider LINQ pour Commerce Server, il nous faut auparavant générer les entités. Pour cela, nous devons utiliser l’outil de commande en ligne CSMetal.

Pour que CSMetal entre en action, il vous faut:

  • Le fichier ChannelConfiguration.config correctement configuré
    • Attention de bien mettre la valeur de l’attribut useSharedCommerceContexts à false.
    • Ajouter dans le noeud MessageHandler avec l’attribut name "CommerceQueryOperation_CommerceEntityDefinition" les noeuds enfant suivants:
   1: <!-- Note that RepositoryMetadataLoader is replaced by a slightly customized one -->

   2: <Component name="RepositoryMetadataLoader" type="Microsoft.Commerce.Metal.Generator.OperationSequenceComponents.RepositoryMetadataLoader, Microsoft.Commerce.Metal.Generator, Version=1.0.0.0, Culture=neutral" />

   3: <!-- Note that this is added to add overlay capability to the Metadata repository -->

   4: <Component name="MetadataOverlayProcessor" type="Microsoft.Commerce.Metal.Generator.OperationSequenceComponents.MetadataOverlayProcessor, Microsoft.Commerce.Metal.Generator, Version=1.0.0.0, Culture=neutral" />

      • Notez que le dernier noeud permet en gros de pouvoir générer d’autres entités ou attributs sans toucher au fichier MetadataDefinitions.xml. Nous y revenons plus bas.
  • Le fichier MetadataDefinitions.xml proprement mis à jour
    • Ajouter au noeud RelationshipTypes, un noeud enfant :
      • <RelationshipType name="Inherits"/>
    • Consultez le fichier “CSMetal_Beta2_ReadMe.rtf” pour ajouter à 2 entités:
      • Basket
        • les énumérations des status de commande
      • Ads
        • Les énumérations des tailles d’une publicité
  • Les “traditionnels” OrderObjectMappings.xml et OrderPipelineMappings.xml, eux aussi mis à jour.

Une fois ces ingrédients sous la main, mettez-les par exemple dans un répertoire temporaire. Ajoutez les fichiers nécessaires à la bonne exécution de CSMetal:

  • CSMetal.exe Smile
  • CSMetal.exe.config qui est une copie du web.config de votre application web
  • GeneratorSettings.xml qui vous permet de définir les dossiers d’outputs pour les assemblies générées avec un namespace et un nom de context de votre choix!
  • Microsoft.Commerce.Metal.Generator.dll pour la génération de code

Soit:

image

Afin de bénéficier pleinement du Linq provider pour Commerce Server, nous avons certaines metadatas à faire évoluer ou créer. Pour cela, Kerry a introduit un concept très pratique appellé “MetaDataOverlays”:

  • Cela revient à étendre les metadatas via un fichier xml extérieur sans avoir à toucher à votre fichier MetadataDefinitions.xml. Dans le cas de notre provider Linq pour Commerce Server, nous avons un certains nombres d’entités à mettre à jour mais qui n’ont pas d’intéret à être dans le runtime de l’application web puisqu’utilisé uniquement par notre provider Linq.

Pour cela, dans le répertoire CSMetal ajouter un nouveau dossier enfant appellé MetadataOverlays et ajoutez-y le fichier xml Metadata_CSMetal.xml

   1: <?xml version="1.0" encoding="utf-8" ?>

   2: <!-- 

   3: This file contains the Metadata Repository

   4: -->

   5: <MetadataDefinitions xmlns="urn:schemas-microsoft-multi-channel-commerce-foundation-metadata">

   6:     <DefaultChannel>

   7:         <CommerceEntities>

   8:             <!-- Added for Linq based Search -->

   9:             <CommerceEntity name="CatalogEntity">

  10:                 <DisplayName value="Catalog Entity" />

  11:                 <Properties>

  12:                     <Property name="Phrase"    dataType="String">

  13:                         <DisplayName value="Phrase"/>

  14:                     </Property>

  15:                     <Property name="ReturnTypes"    dataType="Integer">

  16:                         <DisplayName value="Return Types"/>

  17:                     </Property>

  18:                     <Property name="FirstItem"    dataType="Integer">

  19:                         <DisplayName value="First Item"/>

  20:                     </Property>

  21:                     <Property name="WhereClause"    dataType="String">

  22:                         <DisplayName value="Where Clause"/>

  23:                     </Property>

  24:                     <Property name="TotalItemCount"    dataType="Integer">

  25:                         <DisplayName value="Total Item Count"/>

  26:                     </Property>

  27:                     <Property name="ResultsPerPage"    dataType="Integer">

  28:                         <DisplayName value="Results Per Page"/>

  29:                     </Property>

  30:                 </Properties>

  31:             </CommerceEntity>

  32:             <!-- Added for Linq based Search -->

  33:  

  34:             <!-- Catalog Start -->

  35:             <CommerceEntity name="Catalog">

  36:                 <Relationships>

  37:                     <Relationship name="DependantCatalogs" type="Relationship" modelName="Catalog" isMultipleItems="true" >

  38:                         <DisplayName value="Dependant Catalogs" />

  39:                     </Relationship>

  40:                     <Relationship name="SourceCatalogs" type="Relationship" modelName="Catalog" isMultipleItems="true" >

  41:                         <DisplayName value="Source Catalogs" />

  42:                     </Relationship>

  43:                 </Relationships>

  44:             </CommerceEntity>

  45:  

  46:             <!-- CreditCard Start -->

  47:             <CommerceEntity name="CreditCard">

  48:                 <Relationships>

  49:                     <Relationship name="PaymentAccount" type="Inherits" modelName="PaymentAccount" isMultipleItems="false">

  50:                     </Relationship>

  51:                 </Relationships>

  52:             </CommerceEntity>

  53:  

  54:             <!-- Basket Start -->

  55:             <CommerceEntity name="Basket">

  56:                 <Relationships>

  57:                     <Relationship name="LineItems" modelName="LineItem" type="Relationship" isMultipleItems="true" />

  58:                     <Relationship name="Addresses" modelName="Address" type="Relationship" isMultipleItems="true" />

  59:                     <Relationship name="Payments" modelName="Payment" type="Relationship" isMultipleItems="true" />

  60:                     <Relationship name="Shipments" modelName="Shipment" type="Relationship" isMultipleItems="true" />

  61:                     <Relationship name="RequestedPromoCodes" modelName="RequestedPromoCode" type="Relationship" isMultipleItems="true" />

  62:                 </Relationships>

  63:             </CommerceEntity>

  64:  

  65:             <!-- ShopperList Start -->

  66:             <CommerceEntity name="ShopperList">

  67:                 <Relationships>

  68:                     <Relationship name="LineItems" modelName="LineItem" type="Relationship" isMultipleItems="true" />

  69:                 </Relationships>

  70:             </CommerceEntity>

  71:  

  72:             <!-- LineItem Start -->

  73:             <CommerceEntity name="LineItem">

  74:                 <Relationships>

  75:                     <Relationship name="ItemLevelDiscounts" modelName="Discount" type="Relationship" isMultipleItems="true" />

  76:                 </Relationships>

  77:             </CommerceEntity>

  78:  

  79:             <!-- CashCard Start -->

  80:             <CommerceEntity name="CashCard">

  81:                 <Relationships>

  82:                     <Relationship name="PaymentAccount" type="Inherits" modelName="PaymentAccount" isMultipleItems="false">

  83:                     </Relationship>

  84:                 </Relationships>

  85:             </CommerceEntity>

  86:  

  87:             <!-- GiftCertificate Start -->

  88:             <CommerceEntity name="GiftCertificate">

  89:                 <Relationships>

  90:                     <Relationship name="PaymentAccount" type="Inherits" modelName="PaymentAccount" isMultipleItems="false">

  91:                     </Relationship>

  92:                 </Relationships>

  93:             </CommerceEntity>

  94:  

  95:             <!-- Shipment Start -->

  96:             <CommerceEntity name="Shipment">

  97:                 <Relationships>

  98:                     <Relationship name="ShippingMethod" modelName="ShippingMethod" type="Relationship" isMultipleItems="false" />

  99:                 </Relationships>

 100:             </CommerceEntity>

 101:  

 102:             <!-- Payment Start -->

 103:  

 104:             <!-- PaymentAccount Start -->

 105:             <CommerceEntity name="PaymentAccount">

 106:                 <Properties>

 107:                     <Property name="Id" dataType="String">

 108:                         <DisplayName value="Id"/>

 109:                         <Description value="Unique ID of the payment." />

 110:                     </Property>

 111:                     <Property name="CustomerName" dataType="String">

 112:                         <DisplayName value="CustomerName"/>

 113:                         <Description value="Name of Customer." />

 114:                     </Property>

 115:                     <Property name="BillingAddressId" dataType="String">

 116:                         <DisplayName value="BillingAddressId"/>

 117:                         <Description value="Id of billing address" />

 118:                     </Property>

 119:                     <Property name="DisplayName" dataType="String">

 120:                         <DisplayName value="DisplayName"/>

 121:                         <Description value="DisplayName." />

 122:                     </Property>

 123:                 </Properties>

 124:                 <Relationships>

 125:                     <Relationship name="PaymentMethod" modelName="PaymentMethod" type="Relationship" isMultipleItems="false" />

 126:                 </Relationships>

 127:             </CommerceEntity>

 128:             

 129:             <CommerceEntity name="Payment">

 130:                 <Relationships>

 131:                     <Relationship name="PaymentAccount" modelName="PaymentAccount" type="Relationship" isMultipleItems="false" />

 132:                 </Relationships>

 133:             </CommerceEntity>

 134:         </CommerceEntities>

 135:     </DefaultChannel>

 136: </MetadataDefinitions>

Exécutez maintenant CSMetal.exe:

image

Dans le répertoire configuré dans le GeneratorSettings.xml, vous trouverez 3 fichiers .cs correspondant à vos entités Commerce Server :

image

Vous noterez un fichier odata généré qui sera particulièrement utile pour exposer nos données Commerce Server, mais cela fera l’objet de plusieurs autres posts Smile

Copiez les fichiers GeneratedContexts.cs et GeneratedTypes.cs générés par CSMetal dans le repertoire GeneratedTypes du projet CSMetalLinqProvider (ou mettez les dans les paramètres output de CSMetal, ie le fichier GeneratorSettings.xml, pour ne pas avoir à les copier) et relancez une compilation du projet CSMetalLinqProvider.

Vos entités sont maintenant générées et le provider Linq disponible Smile

 

Récuperer une catégorie reviens maintenant à:

var category = new CategoryContext(commerceServiceProxy)
                  .IncludeChildCategories()
                  .Single(o => o.Id=="Departments" && o.CatalogId==DefaultCatalog);
var childCategories = category.ChildCategories;
ou pour un produit :
var product = new ProductContext(commerceServiceProxy)
                 .Single(o=>o.CatalogId==DefaultCatalog && o.Id=="AW200-12")
var productCode = product.ProductCode;

Ce n’est qu’un petit échantillon de ce que l’on peut faire, et d’autres posts viendront bientôt vous montrer la puissance de ce provider Smile => Pour vos développeurs, plus besoin de connaitre en profondeur CS pour pouvoir l’attaquer et donc faciliter l’adoption de Commerce Server.


JARAC 2011

Leave a Reply

Ou renseignez les champs d'identification ci-dessous (name & email)

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Log in
Creative Commons License