SharePoint : AllowUnsafeUpdate simplifié

July 26, 2010

Voici une petite classe d’extension qui permet d’avoir une gestion plus simple de la propriété AllowUnsafeUpdate de la classe SPWeb :

using System;
using Microsoft.SharePoint;

namespace Hand.Net.SharePoint.Extensions {
    public static class SPWebExtensions {
        public static IDisposable CreateUnsafeCodeAllowedBlock(this SPWeb web) {
            return new UnsafeCodeBlock(web);
        }

        private class UnsafeCodeBlock: IDisposable {
            private SPWeb m_Web;
            private bool m_AllowUnsafeUpdateBackup;
            public UnsafeCodeBlock(SPWeb web) {
                this.m_Web = web;
                this.m_AllowUnsafeUpdateBackup = web.AllowUnsafeUpdates;
                this.m_Web.AllowUnsafeUpdates = true;
                this.m_Web.Update();
            }

            #region IDisposable Members

            public void Dispose() {
                if (!m_AllowUnsafeUpdateBackup) {
                    m_Web.AllowUnsafeUpdates = false;
                    m_Web.Update();
                }
            }

            #endregion
        }
    }
}

L’idée est de détourner l’utilisation de l’interface IDisposable pour pouvoir utiliser un bloc using :

var web = SPContext.Current.Web;

using(web.CreateUnsafeCodeAllowedBlock())
{
    // opérations nécessitant des mises à jour "unsafe"
}

Trois avantages à ce pattern :

  • c’est plus lisible qu’une succession d’appels à la propriété AllowUnsafeUpdate et à la méthode Update()
  • en cas d’exception, la méthode Dispose est garantie d’être appelée… on s’épargne un Finally
  • le code gère l’état avant appel de la propriété AllowUnsafeUpdate en la sauvegardant.

On pourrait aussi imaginer l’utilisation d’une méthode qui reçoit un délégué, mais je trouve qu’est c’est un petit peu lourd à appeler par rapport au using.