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éthodeUpdate()
- 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.