[SharePoint 2010] Extension de SPMetal

Comme vu dans mes articles précédents, il y a certains types de colonnes qui ne sont pas prises en charge lors de la génération du SPMetal, je vous ai déjà montré :

Ces méthodes, à rajouter dans votre fichier généré sont très utiles et faciles à instancier.

Cependant, dans le cas où vous devez rajouter plusieurs fois des listes ou des types de contenu. A chaque regénération, vous devez remettre ces méthodes au bon endroit dans la classe, et je peux vous dire, pour l’avoir fait, que ça prend pas mal de temps et que c’est très répétitif !

Une solution efficace et d’utiliser le Custom Mapping. Il va nous permettre, pour n’importe qu’elle liste ou type de contenu, de rajouter les fonctions nécessaires pour récupérer ce type de colonnes, et cela, une seule et unique fois.

Pour l’exemple, je vais vous montrer un dernier type non pris en charge, qui est:  Type fichiers attachés. En mode Custom Mapping bien sûr.

Il s’agit des SPAttachmentCollection de l’assembly Microsoft.SharePoint.

Il s’agit donc ici d’étendre la classe généré par SPMetal et de rajouter nos propres champs en plus, pour cela, la classe custom mapping prévoit 3 fonctions : MapTo, MapFrom et Resolve.

  • MapFrom pour la lecture (READ). => GET
  • MapTo pour l’écriture (WRITE). => SET
  • Resolve pour la mise à jour (UPDATE).
public partial class Contact : Item, ICustomMapping
{
    private const string CONTENT_FIELD = "Attachments";
    private SPAttachmentCollection _contentAttachments;
    public SPAttachmentCollection ContentAttachments
    {
    }
    
    [CustomMapping(Columns = new string[] { CONTENT_FIELD})]
    public void MapFrom(object listItem)
    {
    }

    public void MapTo(object listItem)
    {
    }

    public void Resolve(RefreshMode mode, object originalListItem, object databaseListItem)
    {
    }
}

Comme les différents types précédents, on commence par instancier l’entité SPAttachmentCollection.

private SPAttachmentCollection _contentAttachments;
       public SPAttachmentCollection ContentAttachments
       {
           get { return _contentAttachments;}
           set
           {
               if (value != _contentAttachments)
               {
                   this.OnPropertyChanging(CONTENT_FIELD, _contentAttachments);
                   _contentAttachments = value;
                   this.OnPropertyChanged(CONTENT_FIELD);
               }
           }
       }

On nomme la variable CONTENT_FIELD du nom de la colonne en question.

Passons à la fonction de lecture:

[CustomMapping(Columns = new string[] { CONTENT_FIELD})]
public void MapFrom(object listItem)
{
           SPListItem item = (SPListItem) listItem;
           if((bool)item[CONTENT_FIELD] != false)
           {
               this.ContentAttachments = (SPAttachmentCollection) item.Attachments;
           }
}

Cette fonction va simplement vérifier qu’un champ du nom en question existe puis le caster au bon format.

Fonction d’écriture :

public void MapTo(object listItem)
{
            SPListItem item = listItem as SPListItem;
            if(this.ContentAttachments != null)
            {
                item[CONTENT_FIELD] = ContentAttachments;
            }
}

Il s’agit du setter, on va donc écrire la valeur de fichiers dans le bon champ de colonne

Fonction de mise à jour :

Il y a plusieurs type d’update à prendre en compte, en fonction de ce que l’on choisit :

  • KeepCurrentValues

    Force la méthode Refresh à permuter les valeurs d’origine avec les valeurs récupérées. Aucune valeur actuelle n’est modifiée.
  • KeepChanges

    Force la méthode Refresh à conserver la valeur actuelle qui a été modifiée, mais met à jour les autres valeurs.
  • OverwriteCurrentValues

    Force la méthode Refresh à substituer toutes les valeurs actuelles par les valeurs de la base de données.
public void Resolve(RefreshMode mode, object originalListItem, object databaseListItem)
 {
     SPListItem originalItem = originalListItem as SPListItem ;
     SPListItem databaseItem = databaseListItem as SPListItem ;

     SPAttachmentCollection originalValue = originalListItem[CONTENT_FIELD] as SPAttachmentCollection ;
     SPAttachmentCollection databaseValue = databaseItem[CONTENT_FIELD] as SPAttachmentCollection ;

     switch (mode)
     {
         case RefreshMode.OverwriteCurrentValues:
             this.ContentAttachments = databaseValue;
             break;
         case RefreshMode.KeepCurrentValues:
             databaseItem[CONTENT_FIELD] = this.ContentAttachments;
             break;
         case RefreshMode.KeepChanges:
             if (this.ContentAttachments != originalValue)
                 databaseItem[CONTENT_FIELD] = this.ContentAttachments;
             else if (this.ContentAttachments == originalValue && this.ContentAttachments != databaseValue)
                 this.ContentAttachments = databaseValue;
             break;
     }
 }

Et voilà, vous gérez chaque fonctions possible, ce qui vous donne pour l’utilisation avec Linq :

image

Vous avez alors accès aux fichiers attachés directement, ici pour la lecture puisque l’objet “item” correspond à la liste “contact” à laquelle nous avons ajouté des fichiers sans rien avoir à faire de plus, les méthodes “mapTo,mapFrom et resolve” se font automatiquement lors de l’appel de la classe généré par SPMetal.

Il faut bien comprendre par cette méthode qu’il faut prendre les listes/types de contenu UNE par UNE afin de rajouter les champs nécessaires, c’est mieux que de les rajouter directement dans le fichier généré puisque par cette méthode, nous le faisons qu’une seule fois.

A vous de choisir votre meilleur solution maintenant.

Répondre

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l'aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

%d blogueurs aiment cette page :