miércoles, 10 de junio de 2009

Disable SharePoint Event Firing from any source code

Sometimes we may be interested in disable events to perform some tests or processes but we're only able to execute DisableEventFiring() and EnableEventFiring() functions from a SPItemEventReceiver.

A possible solution is disable and enable event firing from any source code. To do that, you can follow the next steps:

  1. Add a new class in your namespace which inherits from SPItemEventReceiver.
  2. Create 2 functions in that new class to call EnableEventFiring() and DisableEventFiring().
Now, we can create an instance of that class in our main program class and will be able to use our functions to enable and disable events. The code should be like this:
namespace MyNamespace
{
public class MyEventFiring : SPItemEventReceiver
{
public MyEventFiring()
{
}

public void MyDisableEventFiring()
{
this.DisableEventFiring();
}

public void MyEnableEventFiring()
{
this.EnableEventFiring();
}
}

public class MyClass
{
//...
MyEventFiring mef = new MyEventFiring();
mef.MyDisableEventFiring();
item.Update(); //This Update can be executed withou event firings
mef.MyEnableEventFiring();
//...
}
}

Evitando la ejecución de eventos en SharePoint desde cualquier código

La ejecución de eventos nos puede dar problemas en determinados escenarios o para hacer pruebas concretas, por ejemplo sobre una lista determinada. Aunque existen las funciones DisableEventFiring() y EnableEventFiring(), éstas sólo se pueden invocar desde un SPItemEventReceiver, lo que hace que tengamos que ir a la lista, desactivar los eventos, realizar las pruebas y volver a asociarle los eventos, con los riesgos que ello conlleva ya que podemos dejar la lista en un estado diferente al inicial.

Una solución es hacer que se puedan desactivar y activar los eventos desde cualquier código, para ello tenemos que hacer lo siguiente:

  1. Añadir una clase en nuestro namespace que herede de SPItemEventReceiver.
  2. Crear 2 funciones, una que llame a DisableEventFiring() y otra que llame a EnableEventFiring().
Con esto ya podemos crear una instancia de esta clase en la clase principal de nuestro programa y utilizar nuestras funciones, de forma que nos quedaría algo parecido a esto:

namespace MyNamespace
{
public class MyEventFiring : SPItemEventReceiver
{
public MyEventFiring()
{
}

public void MyDisableEventFiring()
{
this.DisableEventFiring();
}

public void MyEnableEventFiring()
{
this.EnableEventFiring();
}
}

public class MyClass
{
//...
MyEventFiring mef = new MyEventFiring();
mef.MyDisableEventFiring();
item.Update(); //Este Update se podrá hacer sin que ningún evento interfiera
mef.MyEnableEventFiring();
//...
}
}