在以前的一些博客文章中,我曾屢次提到過NancyFx(簡稱:Nancy)這個框架。技術這東西就應該與時俱進、經常使用常新!作了這麼多年的ASP.NET和ASP.NET MVC應 用開發,換換思路用用新東西也是不錯的。最近比較密集的在幾個項目中深度使用了Nancy,甚至對一個先後端業務邏輯都很複雜的原ASP.NET MVC項目,用Nancy框架徹底重寫 —— 2我的用時不到兩週。咱們在.NET方向上完全愛上了Nancy,從本篇開始我將爲你們逐步介紹Nancy這個優秀的輕量級開源Web框架。 linux
ASP.NET MVC是微軟基於ASP.NET開發的類ROR(Ruby On Rails)的Web框架,相比ASP.NET WebForm來講更適合團隊協做開發面向互聯網的Web應用。因爲更加接近原始的Web應用形態,因此靈活性比ASP.NET WebForm更高,深受.NET Web Application開發者們的喜好。 nginx
可是通過了5個大版本的迭代以後,ASP.NET MVC依然沒有脫離ASP.NET這個笨重的老傢伙。當你想繞過ASP.NET作一些事情時,會發現那是不可能的;當你須要一種潔淨的靈活的URL時,你 會發現ASP.NET MVC須要你設置甚是複雜的路由才能知足;當你想把單元測試進行的更加深刻時,你會發現很難很難——笨重的Context天生沒法靈活的Mock!—嗯, 你可能會說,微軟的Fakes不錯對Mock Context仍是有幫助的。但請注意,我前面說的是難而不是不能哦,無論你用Moq仍是Fakes,都挺難,由於設計的時候就沒怎麼考慮這個事情。 git
因此,咱們須要一種新的選擇,至少應該是另一可選項。Nancy就是選項之一,並且表現還不錯。 github
下面來羅列一下Nancy的幾個特色吧 web
Nancy是徹底開源的框架,MIT協議,源代碼Host在的GitHub上。Nancy框架相關的項目都在https://github.com/NancyFx上。其中核心項目 https://github.com/NancyFx/Nancy 的Star已經接近3000,nuget上的package下載總量已經超過20萬。nuget上與nancy有關的package超過120個。 ajax
Nancy的官方博客http://blog.nancyfx.org裏,時不常的會寫一些不錯的相關內容。 json
Nancy官方還開設了一個MVM(Nancy Most Valued Minion Award)獎項,很相似於微軟的MVP獎項。目前尚未什麼很值錢的獎勵,但能夠被受權使用該獎項的徽章,放在本身的博客網站上。 ubuntu
Christian Horsdal在2013年出版過一本74頁的Nancy書《Instant Nancy Web Development》,大部份內容目前仍然不過期,只是價格對中國人來講有點貴 - $12.99。 windows
System.Web是ASP.NET的核心dll。它包含了整個Web應用所需的各類類型,無論你用多少,它就在那裏,很多不輕~ 後端
Nancy是經過插件機制來提供額外功能或替代功能的。Nancy不綁定任何特定的實現或框架,全部的請求和響應處理都構建在鬆散耦合和自由定製的 基礎理念上的。這意味着,Nancy能夠運行在.NET Client Profile環境下,而沒必要像ASP.NET MVC那樣要求必須安裝.NET完整框架。它不依賴於ASP.NET框架也就是System.Web.dll,也就沒必要受ASP.NET的約束。
Nancy不強迫你堅持使用Model-View-Controller的MVC模式或其餘任何模式,只是一種響應http請求的服務端框架,適合用於構架網站、WebService或者WebAPI等類型的應用。
這並不意味着你就不能在Nancy上使用MVC模式,你能夠在Views文件夾下定義本身的視圖,建立Models返回到端點上或者映射請求到 Models上,就如同你使用ASP.NET MVC同樣。因此若是你熟悉ASP.NET MVC那麼你很容易上手使用Nancy,沒必要擔憂學習成本問題。
Nancy提供了一個能夠完整測試requst/response週期的類庫,這樣你不只能夠測試你的請求返回Model是否符合指望,也能夠經過accept標頭測試響應的格式是否正確。 Nancy能夠在沒有Server的狀況下就能測試請求響應,而在ASP.NET MVC中很難。
Nancy中集成了一個叫作TinyIoC的組件,能夠自動發現你全部的依賴關係,也能夠在應用中設置一些特定的依賴關係——在Bootstrapper類中經過各類方法或屬性能夠配置Nancy應用。
固然了,你也可使用插件機制將TinyIoC的Container更換爲Autofac、Unity、Windsor、StructureMap、Ninject……之類的,具體用哪一個就看本身需求和喜愛了。
Nancy的核心特徵之一就是可擴展性。它被設計爲容許你替換任何你想要替換的部分:你能夠自定義Model綁定程序、視圖渲染器、序列化程序等。 事實上你能夠實現本身的INancyEngine,甚至完全改變Nancy的請求處理邏輯等等。Nancy自帶了一組預約義的約定,若是你但願Nancy 換個約定規則,你能夠替換它。全部的一切都是能夠定製的,具有極大的可擴展性。
Nancy的另外一個核心理念就是讓Web開發變得簡單快捷。經過簡潔的語法規範,可讓你在不影響應用程序的前提下,代碼更整潔易懂。能夠用不多量的代碼就能開發一個輕量級應用。
Nancy並無將本身依賴於某個操做系統平臺下,它能夠運行在Windows的.NET上,也經過Mono很是好的運行在Mac OSX和linux系統上。Nancy也能夠運行在樹莓派(Raspberry Pi)這類Mini PC平臺上——固然了,ASP.NET MVC也多數狀況下能夠運行在多種平臺下,尤爲是ASP.NET MVC 6這個全新的版本。
相似於下面的代碼,在Nancy中運行出來的結果並不是一成不變的。
Get["/"] = p => { var model = SomeModel(); return model; };
它能夠經過內容協商(Content Negotiation)機制,經過accept的Header值來決定使用何種方式渲染最終的結果。
默認狀況下,若是用戶使用瀏覽器訪問應用程序的「/」路徑,Nancy會查找一個名字是model對應類型名的視圖,並將model的數據傳遞給視圖,調用相應的視圖引擎渲染後,響應給用戶一個頁面;
而若是客戶端使用ajax之類的方法,告訴服務端你要獲取的是json或xml格式數據,那麼上面的代碼返回的就不是一個網頁,而是model作相應序列化後的數據。
這樣你的一段代碼、同一個地址能夠用來提供多種服務。是否是很酷呢?
Nancy算是一個主機不依賴主義者,能夠運行在IIS、WCF、ASP.NET、嵌入在exe中做爲windows服務或selfhost應用 跑。固然也能夠經過fastcgi-mono-server,運行在nginx、Apache、Lighttpd之類的Linux經常使用WebServer 上。值得一提的是國產免費webserver——Jexus能夠更方便高效的運行Nancy,本博客就是運行在Jexus上,安裝方式能夠參考我以前的文章《Ubuntu Server 上安裝 Jexus》。總之,它幾乎能夠無處不在的!
大多數程序猿/媴們寫的第一個應用就是Hello world,這已經算是這行的慣例了。下面的代碼跑起來後,瀏覽器瀏覽應用的"/"地址,就會看到偉大的「Hello world」。
public class HomeModule : Nancy.NancyModule { public HomeModule() { Get["/"] = x => "Hello World!"; } }
怎麼樣,夠簡潔明快了吧!Nancy默認有兩個約定的地方: