NancyFx系列之 Hello World

    在之前的一些博客文章中,我曾多次提到过NancyFx(简称:Nancy)这个框架。技术这东西就应该与时俱进、常用常新!做了这么多年的ASP.NET和ASP.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更换为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做相应序列化后的数据。

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

可以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方式请求"/"地址。

你可能感兴趣的:(Nancy)