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.
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.
Ş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:
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.
Ş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:
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.