SPPersistedObject: Persistance des données de configuration SharePoint

SharePoint 2010 met à la disposition des développeurs plusieurs mécanismes pour la sauvegarde des données et paramètres de configuration dont :

Dans cet article, notre intérêt se portera sur l'utilisation des objets persistés de SharePoint matérialisés par la classe SPPersitedObject.


La classe SPPersitedObject fournit les méthodes nécessaires à un objet pour qu’il soit sérialisé et déserialisé automatiquement vers le magasin d'objet hiérarchique (Hierarchical Object Store)  de SharePoint.

Pour créer un objet persistant SharePoint, il est donc nécessaire de dériver la classe de cet objet de la classe SPPersistedObject.

Les objets persistés SharePoint ont une nature hiérarchique, chaque objet persisté doit spécifier un objet persistant parent. La racine de cette hiérarchie est la ferme SharePoint matérialisée par la classe SPFarm (qui est aussi un objet persisté). Voici les constructeurs de La classe SPPersustaedObject qui permettent de définir la relation de parenté entre objets persistés :

protected SPPersistedObject(string name, SPPersistedObject parent);
protected SPPersistedObject(string name, SPPersistedObject parent, Guid id);

Un objet persisté doit avoir un nom unique utilisé pour l'identifier, et peut être assimilé éventuellement à un singleton (au sens design pattern).

Les informations utiles d'un objet persisté sont de simples champs (et non pas des propriétés) marqués avec l'attribut [Persisted]. Il faut bien sûr que le type du champ soit sérialisable.
 

Voici un exemple d’implémentation d'un objet persisté :

[Guid("D5F666A9-DF30-450C-82AA-6DA626CA3F5D")]
internal class PersistedObjectExemple : SPPersistedObject
{
    private const string OBJECT_NAME = "Test Object";
    [Persisted]
    private string _persistedField;

    public PersistedObjectExemple()
    {
    }

    private PersistedObjectExemple(SPPersistedObject parent)
     : base(OBJECT_NAME, parent)
    {
    }

    public static PersistedObjectExemple Local
    {
        get
        {
            SPPersistedObject parent = SPFarm.Local;
            var obj = parent.GetChild<PersistedObjectExemple>(OBJECT_NAME);
            if (obj == null)
            {
                obj = new PersistedObjectExemple(parent);
                obj.Update();
            }
            return obj;
        }
    }

    public string PersistedField
    {
        get { return _persistedField; }
        set { _persistedField = value; }
    }
}

Notre implémentation suit le design pattern singleton qui utilise un constructeur privé, et une propriété statique pour l'accès à l'instance. Voici un exemple d'utilisation :

var obj = PersistedObjectExemple.Local;
obj.PersistedField = "example value";
obj.Update();

Pour clôturer cet article, il est important de noter que le magasin d'objets hiérarchiques (Hierarchical Object Store) est persisté dans la base de données de configuration de SharePoint, et que l'accès à ce magasin nécessite des privilèges d'administateur de ferme (même le pool d'application IIS n'y a pas accès par défaut), à moins de modifier la configuration de sécurité par défaut.