NancyFX I: Hello World

ForTutorial NET

Veremos este framework, bastante parecido a Asp MVC o a las Api’s de .Net pero más ligero y bastante potente. Haremos una miniweb para ver cómo empezar.

¿Qué es?

NancyFx és un FrameWork para .Net que es una alternativa a Asp.Net Mvc y Api. Está basado en Sinatra de Ruby y se encargaría de la comunicación de la web. No te fuerza a usar el patrón MVC, pero te permite utilizarlo.

¿Para qué sirve?

Como hemos dicho, es una alternativa a Asp.Net Mvc y Api. NancyFx no es más que un servicio «endpoint» para responder a las peticiones HTTP mediante los verbos apropiados. Es bastante útil para hacer Webs, WebServices y APIs. Lo bueno que tiene NancyFx es que es muy ligero y potente.

Vamos a ver un ejemplo

Vamos a crear un Hello World! Primero crearemos un proyecto de tipo Asp Empty. Este nos dejará el proyecto vacío, ahora vamos a nuget (encima del proyecto le damos a botón derecho/manage nuget package) y buscamos el Nancy.Hosting.Aspnet y lo instalamos.

Ahora que tenemos las referencias del proyecto, crearemos 2 carpetas: Modules y Views. En Modules tendremos los «Controllers”, agregamos una clase que se llame HomeModule con este contenido:

using Nancy;

namespace TestNancy.Modules
{
    public class HomeModule : NancyModule
    {

        public HomeModule()
        {
           Get["/"] = _ =>
            {
                dynamic viewBag = new DynamicDictionary();
                viewBag.hello = "Hello World!";
                return View["ViewBag", viewBag];
            };

Como podemos ver, tenemos que heredar de NancyModule y en el constructor metemos las “rutas”, hemos puesto que en la ruta por defecto cree un diccionario y le ponemos una clave con la frase “Hello Word!” y devolvemos una vista llamada “ViewBag” con el diccionario.

La alternativa en MVC o Api sería tocar el fichero de rutas, aquí las puedes definir en el momento y puedes usar las Regular Expresión (Por ejemplo: si queremos que cuando les pasemos un nombre empiece por Z nos muestre otra vista…)

Crearemos dentro del directorio Views la página ViewBag.html con este contenido:

 
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>NancyFX</title>
</head>
	<body>
	    @Model.hello
	</body>
</html>

Ahora vamos a añadir 2 modelos, 1 modules y 2 Views.

Models

Vamos a crear los modelos primero, para ello creamos un directorio de Models y allí 2 clases HomeModel y BeerModel:

public class HomeModel
    {
        public string Name { get; set; }
        public string LastName { get; set; }
    }</pre>

<pre class="brush: csharp; gutter: true"> 
public class BeerModel
    {
        public string beerName { get; set; }
        public string beerCountry { get; set; }
    }
Modules

Después, en el directorio de Modules, modificamos el HomeModule y añadimos el BeerModule tal que:

    public class HomeModule : NancyModule
    {

        public HomeModule()
        {
            Get["/"] = _ =&gt;
            {
                return View["home", new Models.HomeModel() { LastName = "kkkk", Name = "oo" }];
            };
            Get["/test"] = _ =&gt;
            {
                var a = new List() { new Models.HomeModel() { Name = "Pepe", LastName = "Phone" }, new Models.HomeModel() { Name = "Juan", LastName = "2" }, };
                return View["home2", a];
            };
        }
}

Tenemos una función que muestra la pantalla de home, que devuelve un HomeModel y otra que se le llama con un “/test” que devuelve un List de HomeModel en la vista home2.

    public class BeerModule : NancyModule
    {
        public BeerModule()
        {
            Get["/beer"] = _ =&gt;
            {
                var a = new List() { new Models.BeerModel() {beerCountry  = "France", beerName  = "Belcebuth" }, 
                                                       new Models.BeerModel() { beerCountry = "Germany", beerName = "Samichlaus" }, };
                return View["beer", a];
            };
        }
}

Aquí, cuando hagamos un “/beer” devolverá un List en la vista beer.

Views

Crearemos 2 Views: Home2 y beer:
Home2:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>NancyVsMvc.Mvc - Welcome!</title>
</head>
<body>
    @Each.Model
        name: @Current.Name
        lastname: @Current.LastName    
    @EndEach
</body>
</html>

 
Beer:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
    <h3>Beers</h3>
    @Each.Model
        Name: @Current.beerName
        Contry: @Current.beerCountry

    @EndEach
</body>
</html>

 
En el siguiente veremos cómo utilizar las Regural Expresions con NancyFx