Archivo para septiembre, 2009

WCF y OperationBehaviors

Posted in ASP.NET, Microsoft, Patrones de Diseño, Tutorial on septiembre 30, 2009 by César Intriago

 

Windows Communication Foundation nos permite desarrollar servicios en .Net  de una manera rápida y sencilla, permitiendo soportar varios endpoints y esquemas de configuración. También ofrece un gran nivel de personalización, uno de ellos es poder escribir OperationBehaviors personalizados para nuestro servicio.

Un OperationBehavior nos permite cambiar y controlar el modo en que WCF ejecuta un método, por ejemplo podemos ejecutar código automáticamente antes de que se llame a una operación o después. Este es el caso que veremos en el siguiente ejemplo:

Creación del Servicio

Ok manos a la obra, lo primero es crear un nuevo proyecto WCF, el cual llamaremos “CalculatorService”

image

Luego agregamos dos operaciones a nuestro servicio, tanto en la interfaz como en la implementación: Add y Substract, como se ve en la siguiente figura:

image

Estas dos funciones lo que hacen es agregar y restar un valor de la variable de instancia _currentValue.

Ejecutamos el proyecto, y Visual Studio abrirá un cliente básico para poder probar nuestro servicio:

image

Behaviors

Ahora haremos algo interesante: Cada vez que se llame al método Add o Substract invocaremos de forma automática a un tercer método llamado “Audit”, esto lo hacemos usando OperationBehviors que nos permitirá tener acceso a personalizar la invocación de nuestros métodos.

En el proyecto de nuestro servicio WCF creamos una nueva carpeta llamada Behaviors ya agregamos una nueva clase llamada “MyOperationBehavior.cs” con el siguiente código:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;

namespace CalculatorService.Behaviors
{
    public class MyOperationBehavior : Attribute, IOperationBehavior
    {

        #region IOperationBehavior Members

        public void AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
        {
        }

        public void ApplyClientBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.ClientOperation clientOperation)
        {
        }

        public void ApplyDispatchBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation)
        {

// Decorator pattern.
            dispatchOperation.Invoker = new MyOperationInvoker(dispatchOperation);
        }

        public void Validate(OperationDescription operationDescription)
        {
        }

        #endregion
    }

    class MyOperationInvoker : IOperationInvoker
    {
        private readonly IOperationInvoker _invoker;
        private readonly System.ServiceModel.Dispatcher.DispatchOperation _dispatchOperation;

        public MyOperationInvoker(System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation)
        {
            this._invoker = dispatchOperation.Invoker;
            this._dispatchOperation = dispatchOperation;
        }

        private void HandleOperationRequest(object instance, object[] inputs)
        {
            Service1 srv = (Service1)instance;
            srv.Audit(_dispatchOperation.Name, inputs);
        }

        #region IOperationInvoker Members

        public object[] AllocateInputs()
        {
            return _invoker.AllocateInputs();
        }

        public object Invoke(object instance, object[] inputs, out object[] outputs)
        {
            HandleOperationRequest(instance, inputs);
            return _invoker.Invoke(instance, inputs, out outputs);
        }

        public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state)
        {
            HandleOperationRequest(instance, inputs);
            return _invoker.InvokeBegin(instance, inputs, callback, state);
        }

        public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result)
        {
            return _invoker.InvokeEnd(instance, out outputs, result);
        }

        public bool IsSynchronous
        {
            get { return _invoker.IsSynchronous; }
        }

        #endregion
    }
}

Ahora decoramos nuestros métodos Add y Substract con el atributo anterior y creamos el método “Audit”:

image

Lo que hemos hecho hasta el momento es crear una clase MyOperationBehavior que se encarga de conectar el MyOperationInvoker al servicio. Al aplicar el atributo  [MyOperationBehavior] en cada operación hacemos que WCF use nuestro Operation Invoker para llamar a las respectivas funciones.

Dentro de MyOperationInvoker estamos llamando primero al método Audit para imprimir en pantalla la operación que el usuario está a punto de ejecutar.

Esto nos da el control de poder ejecutar código adicional antes de que se ejecute el método que invocó el cliente (o incluso desués). Si volvemos a ejecutar el servicio podemos ver los resultados en la ventana “Output” de Visual Studio 2010.

image

Nota: Este mismo resultado se pudo obtener llamando desde los métodos Add y Substract al método Audit. Pero gracias a los OperationBehaviors podemos remover esta lógica de cada posible método que tengamos y ponerla en un solo lugar.

Anuncios

Follow me on…..

Posted in Noticias on septiembre 29, 2009 by César Intriago

twitter

 

Me dicen que me pierdo de cosas interesantes por no estar en Twitter, así que me cree una cuenta, instalé TweetDeck, digamos las palabras mágicas y ahora veamos que pasa: 

Follow me on Twitter: @ForerunnerG34

Visual Studio 2010 Beta 1

Posted in Microsoft on septiembre 29, 2009 by César Intriago

Por estos días descargué la versión Beta 1 de Visual Studio 2010 para empezar a probarlo, me parece que anda muy bien el Beta 1, salvo un pequeño bug que se está convirtiendo en algo muy molesto, espero que sea corregido en el Beta 2.

Personalmente el cambio mas radical que tiene Visual Studio 2010 es que está desarrollado con Windows Presentation Foundation, posee una nueva página de inicio y el cuadro de diálogo para cerar nuevos ítems está también remodelado.

image image

image image

Visual 2010 viene con una gran cantidad de mejoras y cambios, en lo personal tres  “killing features”:

  1. Ahora tenemos control sobre la lista de proyectos en la página de inicio: Anclar proyectos o removerlos de la lista.
  2. Las ventanas del editor de código son desacoplables lo que permite arrastrarlas libremente por la pantalla, incluso tenerlas en un monitor secundario.
  3. Poder desarrollar extensiones para Visual Studio 2010  usando WPF.

 

image image

image

 

 

Un “Tail” en WPF

Posted in Aplicaciones, WPF on septiembre 10, 2009 by César Intriago

 Estoy preparando un nuevo proyecto que permite hacer un “tail -f” de archivos de texto, hay algunas soluciones ya existentes pero me llamó la antención hacer una propia usando WPF, desde luego el código fuente estará disponible pero en esta ocasión planeo subirla a CodePlex para ver como me va!, UPDATE: EL código fuente será subido en SkyDrive como el resto de aplicaciones para evitar tener repartidos los proeyctos en varios lugares. Será en otra ocasión CodePlex!!

Les dejo un adelanto de la IU:

 

image

[ Ventana Principal ]

 

image

[ Creación de Keywords ]

 

image

[ Lista de Keywords ]

 

image

image

[ Tailing de un archivo de texto ]