Nancy (NancyFx) ile Yeni Bir Başlangıç

Nancy, .net ve mono üzerinde http tabanlı servisler oluşturmak için geliştirilmiş bir kütüphanedir. Az kaynak tüketen (lightweight), performanslı bir yapı sunmaktadır. Yazılımcının asıl işine odaklanmasını sağlayan basit ve kullanışlı bir yapıdır. Bir web sitesini, Nancyfx ‘in akıllıca seçilmiş önayarları sayesinde, konfigürasyon dosyaları ile boğuşmadan, çok kısa bir zamanda geliştirebilirsiniz.

Nancy, Ruby de kullanılan bir web framework olan Sinatradan esinlenilerek geliştirilmiştir.

Asp.net Web Api ve MVC’nin alternatifi olarak Nancy’i gönül rahatlığı ile kullanabiliriz.

Bu konuyu daha iyi anlamak için küçük bir console uygulaması yapacağız. IIS/IIS express gibi web serverlarla uğraşmamak, zaman kaybetmemek için owin standardına uygun, self host yapacak şekilde uygulamamızı geliştireceğiz. Nancy’ı herhangi bir desktop, windows service veya konsol uygulamasında host edebiliriz.

Nuget ile aşağıdaki kütüphanelerin kurulumunu yapalım:

Install-Package Nancy
Install-Package Nancy.Owin
Install-Package Nancy.Viewengines.Razor
Install-Package Microsoft.Owin.Hosting
Install-Package Microsoft.Owin.Host.HttpListener

Konsol uygulamamızın Main.cs dosyasını aşağıdaki şekilde değiştirelim:

using Microsoft.Owin.Hosting;
using Owin;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace nancyfxtutorial
{
    class Program
    {
        static void Main(string[] args)
        {
            var url = "http://+:8080";

            using (WebApp.Start<Startup>(url))
            {
                Console.WriteLine("Running on {0}", url);
                Console.WriteLine("Press enter to exit");
                Console.ReadLine();
            }
        }

        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                app.UseNancy();
            }
        }
    }
}

Uygulamamızı çalıştırıp, http://localhost:8080 adresine tarayıcımızdan bağlanmaya çalışalım.

nancynotfound

Bize 404 hatası dönecektir. Bu hatayı vermesinin sebebi; Herhangi bir nancy modulü eklemedik ve dolayısıyla route tanımlamadık. Bu yüzden yeni bir modüle ekliyoruz. Add class diyerek yeni bir sınıf ekliyoruz: MainModule.

using Nancy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace nancyfxtutorial
{
    public class MainModule : NancyModule
    {
        public MainModule()
        {
            Get["/"] = parameters =>
            {
                return "Hello World";
            }; 
        }
    }
}

Tarayıcımızdan tekrar aynı adrese gidersek, hello world yazısını görebiliriz.

nancyhelloworld

Şimdi razor viewengine kullanarak bir örnek yapalım. Sağ tıklayarak New Item komutuna tıklayarak html file seçeneğini bulalım. Dosya uzantısını cshtml yapalım: MyView.cshtml.

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    @for (int i=0; i<5; i++)
    {
        <h4>Hello @i</h4>
    }
</body>
</html>

MainModule dosyasını yeni view’ımızı döndürecek şekilde değiştirelim:

using Nancy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace nancyfxtutorial
{
    public class MainModule : NancyModule
    {
        public MainModule()
        {
            Get["/"] = parameters =>
            {
                return View["MyView.cshtml"];
            }; 
        }
    }
}

Programımızı tekrar çalıştırıp, tarayıcımızdan sitemizi açmaya çalışınca hata alırız:

nancynoview

Unable to locate view hatası yani web uygulamamız, MyView.cshtml dosyasını bulamıyor hatası , bir şeyi eksik yapmış olduğumuzu gösteriyor.

MyView.cshtml dosyasını solution explorerda bulup, ‘Copy to Output Directory’ özelliğini ‘Copy always’ yapıyoruz. Tekrar derleyip çalıştırınca artık hata vermeyecektir.

nancyrazorview

Şimdi de view’ımıza model gönderelim. MainModule.cs’yi tekrar değiştiriyoruz:

using Nancy;
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace nancyfxtutorial
{
    public class MainModule : NancyModule
    {
        public MainModule()
        {
            Get["/"] = parameters =>
            {
                dynamic model = new ExpandoObject();
                model.Name = "Ali";
                return View["MyView.cshtml",model];
            }; 
        }
    }
}

MyView.cshtml:

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    @for (int i=0; i<5; i++)
    {
        <h4>Hello @Model.Name</h4>
    }
</body>
</html>

Artık ekranımız model sınıfının özelliklerine erişebilir:

nancyhelloali

Web uygulamanız çok fazla I/O yapıyorsa, çok şanslısınız demektir. Çünkü framework async özelliğini desteklemektedir. MainModule.cs’nin buna göre yeniden yazılması:

using Nancy;
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace nancyfxtutorial
{
    public class MainModule : NancyModule
    {
        public MainModule()
        {
            Get["/", true] = async(parameters, ct) =>
            {
                dynamic model = new ExpandoObject();
                model.Name = "Ali";
                return View["MyView.cshtml",model];
            }; 
        }
    }
}

Nancy’ye bu yazımızda hızlı bir giriş yapmış olduk.

 

 

 

 

 

Yorum bırakın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Scroll to Top