NServiceBus 3.0 - Message Mutators

Con la entrada del nuevo año ya falta menos para tener la versión definitiva de NServiceBus 3.0. Esta versión traerá un gran número de nuevas funcionalidades. Entre ellas:

  • Integración de RavenDB para la persistencia de Sagas y almacenamiento de la información de subscripciones.
  • Soporte para Azure.
  • Transportar grandes cantidades de datos gracias al DataBus.
  • Una configuración mucho más sencilla y no intrusiva.

Podéis leer un resumen de estas funcionalidades y descargar la beta desde aquí: http://www.nservicebus.com/NServiceBusV3NewFeatures.aspx

En este post hablaremos de los MessageMutators, una nueva funcionalidad que actúa como interceptores de los mensajes al llegar y/o al salir de nuestro endpoint. Así, podemos ejecutar transformaciones a nuestros mensajes de forma dinámica.

Tenemos dos tipos de MessageMutators:

  • IMessageMutator: Esta interfaz nos permite ejecutar cualquier acción sobre un mensaje en concreto.
  • IMutateTransportMessages: Esta interfaz se diferencia de la anterior en que aplicamos las acciones sobre un TransportMessage, este puede contener múltiples mensajes. Realmente, estos conceptos son más difíciles de explicar que de implementar. Por eso, vamos a amenizar el artículo mediante un ejemplo.

Tenemos el siguiente mensaje, muy simple:

1
2
3
4
5
public class SampleMessage : IMessage
{
public string MyProperty { get; set; }
public int MyNumber { get; set; }
}

Utilizaremos un interceptor para encriptar los mensajes antes de salir del endpoint y desencriptarlos al entrar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class TransportEncryptionMutator : IMutateTransportMessages
{
public void MutateIncoming(TransportMessage transportMessage)
{
var decrypt = EncryptionHelper.Decrypt(transportMessage.Body);
transportMessage.Body = decrypt;
}
public void MutateOutgoing(object[] messages, TransportMessage transportMessage)
{
var encrypt = EncryptionHelper.Encrypt(transportMessage.Body);
transportMessage.Body = encrypt;
}
}

Y finalmente lo registramos mediante el contenedor de IoC de NServiceBus.

1
2
3
4
5
6
7
8
9
public class Initialization : IWantCustomInitialization
{
public void Init()
{
Configure.Instance.Configurer
.ConfigureComponent<TransportEncryptionMutator>(
DependencyLifecycle.InstancePerCall);
}
}

Ahora solo falta referenciarlo desde los proyectos cliente y servidor y cuando enviemos un mensaje, estos serán encriptados al enviar y desencriptados al recibir.

Message Mutators

Tal y como podemos ver en la imagen: sin aplicar el MessageMutator y aplicándolo.

El ejemplo puede descargarse de: https://github.com/mserrate/NServiceBus.Samples