Iniciando con OWIN, el inicio de algo grande, Parte II

Hola, ya vimos una pequeña introducción a Katana en el articulo pasado en donde vimos una introducción a su funcionamiento. Ahora es tiempo de dar mayor funcionalidad, mi idea es ir paso a paso agregando módulos para ir armando una pequeña app en donde podamos ver lo siguiente:

  • Productos con Stock
    • Producto 1
    • Producto 2
    • Producto 3
  • Producto Sin Stock
    • Producto 5
    • Producto 6

Para esto utilizaremos Katana claro está, Nancy para la generación de las etiquetas en el servidor y exponer los archivos estáticos HTML, Web API para los request AJAX y SignalR para el servicio de mensajería en tiempo real, como ven , utilizaremos algunas de las ultimas tecnologías disponibles para ASP.NET

Voy a continuar del ejemplo anterior, y mediante NuGet, voy a instalar el paquete de Nancy (nancy.owin)

image

Recuerda que  hay más paquetes de Nancy que te vas a encontrar en NuGet, pero para este caso, debes seleccionar Nancy.Owin. Ahora ya tenemos la referencia:

image

Paso siguiente es crear el módulo que nos servirá de ruteo en la generación de las etiquetas, puedes ver más sobre la definición de las Rutas de Nancy acá https://github.com/NancyFx/Nancy/wiki/Defining-routes

Nancy opera similar a MVC para manejar los request, por lo que te será familiar la construcción del módulo:

using System;

using System.Collections.Generic;

using System.Linq;

 

namespace DemoNancyOwin

{

    public class HomeModule : Nancy.NancyModule

    {

        public HomeModule()

        {

            Get["/"] = _ =>

            {

                var model = new

                {

                    titulo = "Listado de Productos",

                    autor = "Chalalo"

                };

                return View["home.html", model];

            };

            Get["/acerca"] = _ =>

            {

                var model = new

                {

                    autor = "Chalalo"

                };

                return View["acercade.html", model];

            };

 

        }

    }

}

Lo anterior declara que los request apuntados a la raíz de la aplicación(“/”) deben ser manejados por un delegado anónimo definido el la asociación de la expresión lambda. Esta funciona crea el modelo que solo tiene el titulo y el autor del articulo (jejejee), Nancy se encargará de hacer el render al view home, pasando el modelo a la vista.

Ahora construiremos la vista, para esto hago una carpeta que se llamará views y dentro agrego el archivo Home.html, que tendrá el siguiente aspecto (muy básico, sin css, todo me queda feo)

image

El código asociado a esto es:

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">

<head>

    <meta charset="utf-8" />

    <title>@Model.titulo</title>

</head>

<body>

    <span>By @Model.autor</span>

    <section>

        <h2>Productos Con Stock</h2>

        <ul id="pcs">

            <li>Acá van los productos CS</li>

        </ul>

    </section>

 

    <section>

        <h2>Productos Sin Stock</h2>

        <ul id="pcs">

            <li>Acá van los productos SS</li>

        </ul>

    </section>

 

</body>

</html>

El acerca de solo tiene el siguiente código:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">

<head>

    <title></title>

</head>

<body>

    <h1>Demo por @Model.autor </h1>

</body>

</html>

n esto hemos creado una funcionalidad básica, que todavía no funciona! esto es por que no hemos establecido el “pipeline Owin” y configurar el módulo de Nancy para participar en este pipeline. Si no has visto el post anterior, en esa oportunidad  instalamos los componentes de Katana Host y  Katana Server, en donde podemos utilizar Katana con IIS o “self-hosting” en donde el mismo proyecto es su propio host.

Volviendo al ejemplo, los componentes de Katana utilizan varias convenciones diferentes para cargar y ejecutar aplicaciones OWIN incluidas en el clase Start. Cuando un host de Katana carga una app OWIN, lo dirige a una clase de partida basada en las siguientes reglas:

  1. Si el archivo web.config contiene en la sección appSeting key=”owin:AppStartup”, el loader usa este valor de ajuste. El valor debe ser un tipo valido de NET.
  2. Si el ensamblado contiene el atributo [assembly: OwinStartup(typeof(MyStartup))], el loader usará el tipo especificado en el valor del atributo.
  3. Si se tiene ambas condiciones anteriores, el loader utilizará la opción 2.
  4. Si ninguna de estas condiciones se cumple, el loader va a escanear los ensamblados cargados en busca de un tipo denominado Startup, con un método que coincide con la firma Configure(IAppBuilder app)

Para este ejemplo vamos a ocupar la opción 2 (lo puedes ver cuando agrego el Startup.cs). De todas maneras, la documentación dice que si tenemos muchos tipos y clases diferentes, lo mejor es utilizar el AppSetting o el atributo del ensamblado para evitar una búsqueda innecesaria.

En nuestro proyecto( te recuerdo la estructura), tenemos una clase Statup, que es nuestro loader, la cual inicializa el pipeline Owin y en donde debemos agregar el componente de Nancy.

image

Así que modifico el ejemplo que veníamos usando, y de le indicamos a  la app que vamos a utilizar Nancy ( voy a comentar lo que vimos en el post Anterior)

using System;

using System.Threading.Tasks;

using Microsoft.Owin;

using Owin;

 

[assembly: OwinStartup(typeof(KatanaDemo2.Startup))]

 

namespace KatanaDemo2

{

    public class Startup

    {

        public void Configuration(IAppBuilder app)

        {

           /* app.Run(context =>

            {

                context.Response.ContentType = "text/html";

                return context.Response.WriteAsync("<h1> Hola Mundo!!</h1>");

            });*/

 

            app.UseNancy();

        }

    }

}

y ya estamos para la primera demo:

image

Como puedes ver, funciona. Ahora bien, el proyecto de ASP.NET por defecto agrega las referencias a System.Web, para asegurarme, eliminé todas las referencias y volví a ejecutar, acá la idea es la independencia!

image

Ya no esta System.Web en el proyecto y el concepto se mantiene, funcionando sin problemas la aplicación Sonrisa.

La estructura del proyecto es:

image

y a lo que queremos llegar en este serie de artículos es:

image

En este articulo vimos como agregar Nancy al Pipeline y a rutear de manera básica mediante este Framework, en el próximo articulo vamos a ver como asociar desde el cliente al server  mediante ASP.NET Web API.

Saludos!!
@chalalo

Un comentario en “Iniciando con OWIN, el inicio de algo grande, Parte II”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *