NancyFx系列之 Hello World

    在以前的一些博客文章中,我曾屡次提到过NancyFx(简称:Nancy)这个框架。技术这东西就应该与时俱进、经常使用常新!作了这么多年的ASP.NETASP.NET MVC应 用开发,换换思路用用新东西也是不错的。最近比较密集的在几个项目中深度使用了Nancy,甚至对一个先后端业务逻辑都很复杂的原ASP.NET MVC项目,用Nancy框架彻底重写 —— 2我的用时不到两周。咱们在.NET方向上完全爱上了Nancy,从本篇开始我将为你们逐步介绍Nancy这个优秀的轻量级开源Web框架。 linux

为何选择Nancy

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

  • 开源&社区化
  • 不依赖于ASP.NET
  • MVC模式不是必选项
  • 先天易于测试
  • 先天支持依赖注入
  • 高度可定制
  • 简洁明快
  • 跨平台(支持.NET和Mono)
  • 支持内容协商
  • 能够host在任何应用中
  • ……

开源&社区化

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

不依赖于ASP.NET

System.Web是ASP.NET的核心dll。它包含了整个Web应用所需的各类类型,无论你用多少,它就在那里,很多不轻~ 后端

Nancy是经过插件机制来提供额外功能或替代功能的。Nancy不绑定任何特定的实现或框架,全部的请求和响应处理都构建在松散耦合和自由定制的 基础理念上的。这意味着,Nancy能够运行在.NET Client Profile环境下,而没必要像ASP.NET MVC那样要求必须安装.NET完整框架。它不依赖于ASP.NET框架也就是System.Web.dll,也就没必要受ASP.NET的约束。

MVC模式不是必选项

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更换为AutofacUnityWindsorStructureMapNinject……之类的,具体用哪一个就看本身需求和喜爱了。

高度可定制

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作相应序列化后的数据。

这样你的一段代码、同一个地址能够用来提供多种服务。是否是很酷呢?

能够host在任何应用中

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,这已经算是这行的惯例了。下面的代码跑起来后,浏览器浏览应用的"/"地址,就会看到伟大的“Hello world”。

public class HomeModule : Nancy.NancyModule
{
    public HomeModule()
    {
        Get["/"] = x => "Hello World!";
    }
}

怎么样,够简洁明快了吧!Nancy默认有两个约定的地方:

  • 每一个模块都要派生自NancyModule,NancyModule相似于MVC中的Controller
  • 构造函数中定义路由地址和请求方式,Get["/"]表示经过GET方式请求"/"地址。
相关文章
相关标签/搜索