DETALLES DEL CASO

Tenemos un cliente nuevo que desea actualizar su vieja página web a una nueva creada con las ultimas tecnologias Microsoft ASP.Net MVC, manteniendo la compatibilidad con sus proveedores de servicios. Una de las librerías proporcionada por sus proveedores de servicios, genera automáticamente fragmentos de código html que se inserta en la página. Durante el proceso de implementación de esta librería, nos hemos dado cuenta que le falta un método y lo vamos a implementar utilizando métodos de extensión.

SOLUCION (Métodos de extensión)

Los métodos de extensión permiten “agregar” métodos a los tipos existentes sin crear un nuevo tipo derivado, recompilar o modificar de otra manera el tipo original. Los métodos de extensión son una clase especial de método estático, pero se les llama como si fueran métodos de instancia en el tipo extendido. En este tutorial vamos a ver que son los métodos de extensión y como se implementan.

 


Empezamos creando un nuevo proyecto de pagina web con la tecnología ASP.NET Web Application (.Net Framework (Visual C#)) y template MVC.

Pasos: [File] > [New] > [Project…] >> [Installed] > [Visual C#] > [Web] > [ASP.NET Web Application (.Net Framework)] > [Definimos el nombre de la aplicación/solución] > [OK] >> [Template MVC] > [OK]

 

EL CONTROLADOR

Una vez creado el proyecto, lo primero que tenemos que hacer es referenciar la librería BGTecuLibrary.dll que nos proporciona el código fuente de algunas zonas de la página.
Pasos: [En el panel de la derecha (Solution Explorer)] > [En la aplicación (Extension Methods MVC)] > [Hacemos Click Derecha sobre (References)] > [Add Reference…] > [En el panel de la izquierda elegimos (Browse)] > [Browse…] > [Buscamos la ruta donde esta guardada la libreria .dll y la seleccionamos] > [Add] > [OK]

 

Abrimos el controlador (HomeController.cs) y empezamos a configurarlo para comprobar el funcionamiento de la librería. Hacemos el using.
Pasos: [En el panel de la derecha (Solution Explorer)] > [En la aplicación (Extension Methods MVC)] > [Expandimos la carpeta (Controllers)] > [Abrimos el controlador (HomeController.cs)] > [En la parte superior hacemos el using de la librería referenciada]

using BGTecuLibrary;

 

Durante todo este tutorial trabajaremos solo sobre la Vista y ActionResult (Index). La librería BGTecuLibrary.dll aporta al proyecto un nuevo tipo llamado Empleado con sus propiedades y sus métodos. Creamos dos empleados para probar con ellos los métodos incluidos en la librería. Utilizamos ViewBag para enviar el resultado a la vista.
Pasos: [Dentro de public ActionResult Index()] > [Crearemos e instanciamos dos variables de tipo Empleado] > [Creamos Varios ViewBags] > [Los llenamos con los que devuelven los métodos la la librería]

// CREAMOS DOS EMPLEADOS DE PRUEBAS
Empleado emp1 = new Empleado()
{
    Nombre = "Beniamin"
    , Apellido = "Tecu"
    , Especialidad = "Software Developer"
    , Empresa = "The Boring Company"
    , Salario = "$117000"
};

Empleado emp2 = new Empleado()
{
    Nombre = "Gabriel"
    , Apellido = "Tecu"
    , Especialidad = "Desarrollo Web"
    , Empresa = "Tajamar"
    , Salario = "98000€"
};

// CARGAMOS EL CODIGO HTML DEVUELTO POR LAS FUNCIONES DE NUESTRA LIBRERIA EN VIEWBAGS
ViewBag.Table = emp1.ToTable();
ViewBag.DD1 = emp1.ToDefinition();
ViewBag.DD2 = emp2.ToDefinition();

 

LA VISTA

Vamos a ir a la Vista Index de Home, y adaptarla para que nos muestre lo que contienen los ViewBags. Para ello, reemplazamos todo su contenido con el siguiente fragmento de código.
Pasos: [En el panel de la derecha (Solution Explorer)] > [En la aplicación (Extension Methods MVC)] > [Expandimos la carpeta (Views)] > [Expandimos la carpeta (Home)] > [Abrimos la vista (Index.cshtml)] > [Remplazamos su contenido por el siguiente]

@{
    ViewBag.Title = "Home Page";
}
@Html.Raw(ViewBag.Table)

 

 

@Html.Raw(ViewBag.DD1)

 

@Html.Raw(ViewBag.DD2)

 

@Html.Raw(ViewBag.DD1)

 

 

@Html.Raw(ViewBag.Sentence1)
@Html.Raw(ViewBag.Sentence2)

 

 


Ejecutamos para ver el resultado, y esto es lo que obtenemos.

 

EL NUEVO METODO

Volvemos a HomeController.cs e intentamos buscar el método que falta.Para ello escribimos el nombre de la variables de tipo Empleado seguido de un punto para que se despliegue la lista con propiedades y métodos soportados por este tipo.

 

Como podemos ver, el método .ToSentence no existe en este tipo.

CREACION DEL WRAPPERBGTecuLibrary

Para implementar el nuevo método, creamos una nueva librería en la que construiremos este nuevo método y tal vez otros mas adelante. La nueva libraria tendra que ser Class Library (.Net Standard) y tambien tendrá que tener referenciado el nuevo tipo.
Pasos: [Sobre el nombre de la solución] > [Click Derecha] > [Add] > [New Project…] > [En el menú de la izquierda (Install)] > [Visual C#] > [.Net Standard] > [Class Library (.Net Standard)] > [Le definimos el nombre de WrapperBGTecuLibrary] > [OK]

 


Referenciamos la librería original y creamos una nueva clase llamada EmpleadoExtendedMethods. Hacemos el using tal y como hemos hecho en el proyecto Extension Methods MVC. Para un correcto funcionamiento, tanto la clase como los métodos que queramos extender tienen que ser public static. Además, los métodos de extensión tienen que recibir el tipo original con this delante. Este es el contenido del archivo EmpleadoExtendedMethods.cs

using System;
using System.Collections.Generic;
using System.Text;
using BGTecuLibrary;

namespace WrapperBGTecuLibrary
{
    public static class EmpleadoExtendedMethods
    {
        public static String ToSentence(this Empleado e)
        {
            String html = "";
            html += e.Nombre + " es el mejor empleado de " + e.Empresa;
            html += ". Esta especializado en " + e.Especialidad + " y solo cobra " + e.Salario;

            return html;
        }
    }
}

 

YA TENEMOS EL METODO EXTENDIDO

Volvemos a nuestro proyecto MVC. Agregamos a referencias y hacemos el using de la nueva librería. Con esto ya debería de aparecer el nuevo método como parte de los empleados. Si aparece, configuramos los ultimos dos ViewBag

ViewBag.Sentence1 = emp1.ToSentence();
ViewBag.Sentence2 = emp2.ToSentence();

 


Como se puede apreciar en la animación, ahora el Empleado tiene un método nuevo que funciona de forma totalmente transparente, como si fuera de la misma librería. También si te has fijado, el icono de este método tiene una flecha hacia abajo lo que nos indica que esta es un método de extension.

EJECUTAMOS NUESTRO PROJECTO UNA ULTIMA VEZ

En esta última ejecución ya ha aparecido el ultimo formato de datos, gracias al metodo de extension .ToSentence.

 

Autor/a: Beniamin Gabriel Tecu

Curso: Microsoft MCSA Web Applications + MCSD App Builder

Centro: Tajamar

Año académico: 2017-2018

GitHub: https://github.com/BGTecu/ExtensionMethodsMVC

LinkedIn: https://es.linkedin.com/in/bgtecuom/in/bgtecu