Cascade-Lambda pattern

Es momento de hacer más interesante el patrón anterior. Antes que nada recordemos cual fue el resultado final en ese momento:

new EmailManager()
    .Client("client")
    .From("from@sebys.com.ar")
    .To("to@sebys.com.ar")
    .Subject("Envio email")
    .Body("Este es el contenido del e-mail")
    .Send();

Como podrán notar, el método Send() es el que realiza la “acción final” en todas las instancias de EmailManager. Esto nos permite deducir dos cosas, la primera es que toda instancia de EmailManager “finaliza” cuando realizamos el envío de correo y la segunda es que implícitamente estamos diciendo que para realizar un nuevo envío de correo necesitamos crear una nueva instancia. Aunque el comportamiento es bastante lógico, nuestra API no es explicitamente clara en su comportamiento.

Para hacer explicito este comportamiento, podemos hacer uso de las expresiones lambda.

Para trabajar con expresiones lambda vamos a convertir el método Send() es un método estático y cambiar su firma para que acepte un delegado Action<T>. Este delegado debe tomar como parámetro una instancia de EmailManager. Por último vamos a invocar la acción dentro del método, previo a realizar el envío propiamente dicho:

public static void Send(Action action)
{
    action(new EmailManager());
    Console.WriteLine("Enviar correo...");
}

Ahora veamos como cambia la forma de invocar a EmailManager:

static void Main(string[] args)
{
    EmailManager.Send((mail) => mail.Client("client")
                                   .From("from@sebys.com.ar")
                                   .To("to@sebys.com.ar")
                                   .Subject("Envio email")
                                   .Body("Este es el contenido"));
}

Con esto logramos eliminar toda confusión acerca de como debe realizarse el envió del e-mail, ya que lo que el método Send() establece claramente donde debe “construirse” el correo y que puede enviarse una única vez por instancia.

¡Espero que les sea de utilidad!

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s