NancyFx系列之 Hello World

衣明志 发表于 , 阅读 (12411)

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

为什么选择Nancy

ASP.NET MVC是微软基于ASP.NET开发的类ROR(Ruby On Rails)的Web框架,相比ASP.NET WebForm来说更适合团队协作开发面向互联网的Web应用。由于更加接近原始的Web应用形态,所以灵活性比ASP.NET WebForm更高,深受.NET Web Application开发者们的喜爱。

但是经过了5个大版本的迭代之后,ASP.NET MVC依然没有脱离ASP.NET这个笨重的老家伙。当你想绕过ASP.NET做一些事情时,会发现那是不可能的;当你需要一种洁净的灵活的URL时,你会发现ASP.NET MVC需要你设置甚是复杂的路由才能满足;当你想把单元测试进行的更加深入时,你会发现很难很难——笨重的Context天生无法灵活的Mock!—嗯,你可能会说,微软的Fakes不错对Mock Context还是有帮助的。但请注意,我前面说的是难而不是不能哦,不管你用Moq还是Fakes,都挺难,因为设计的时候就没怎么考虑这个事情。

所以,我们需要一种新的选择,至少应该是另外一可选项。Nancy就是选项之一,而且表现还不错。

下面来罗列一下Nancy的几个特点吧

  • 开源&社区化
  • 不依赖于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个。

Nancy的官方博客http://blog.nancyfx.org里,时不常的会写一些不错的相关内容。

Nancy官方还开设了一个MVM(Nancy Most Valued Minion Award)奖项,很类似于微软的MVP奖项。目前还没有什么很值钱的奖励,但可以被授权使用该奖项的徽章,放在自己的博客网站上。

Christian Horsdal在2013年出版过一本74页的Nancy书《Instant Nancy Web Development》,大部分内容目前仍然不过时,只是价格对中国人来说有点贵 - $12.99。

不依赖于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方式请求"/"地址。

好,更细节的内容,我将从下一篇开始带大家一起详细了解。

12 条评论
晚安
晚安 2015-04-09 08:02
密切关注衣大师的nancyfx系列文章
宇内
宇内 2015-04-09 09:11
非常看好基于OWIN的没有操作系统依赖性的web框架,而NancyFx是这类框架的代表作。
小蝶
小蝶 2015-04-09 09:19
Mark~~持续关注!
Justin Liu
Justin Liu 2015-04-09 09:43
已收藏
垃圾游戏制造者
好系列,顶赞,持续关注
Allen
Allen 2015-04-11 13:29
关注NancyFx系列文章....
俺本善良
俺本善良 2015-06-08 16:24
通俗易懂,我的小站也是用的Nancy+SqlServer搭建的,不过从通用性和性能等各个角度,和明智哥还是有些差距,学习你的mzblog代码价格中。
刺客
刺客 2015-06-15 09:07
学习中!期待更新!
刺客
刺客 2015-07-04 18:43
咋还不更新啊!等的花都谢了!
外乡人
外乡人 2015-10-13 15:09
求教,nancyfx的viewModel支持强类型吗?
zhang
zhang 2016-04-20 10:48
学习中!期待更新!
老赵
老赵 2016-11-19 01:19
密切关注衣大师的nancyfx系列文章