2019独角兽企业重金招聘Python工程师标准>>>

在之前的一些博客文章中,我曾多次提到过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方式请求"/"地址。

转载于:https://my.oschina.net/lichaoqiang/blog/601798

NancyFx系列之 Hello World相关推荐

  1. 使用Nancy打造TaskManager2.0管理系统

    上一篇开源任务管理平台TaskManager介绍发布后,有网友联系我看看能不能做个后台管理界面,方便管理系统中所有的任务.由于时间和技术问题1.0版本的时候,新增了一个3分钟读取配置文件动态修改任务的 ...

  2. 妙用postman系列——postman建组、分享

    妙用postman系列--postman建组.分享 添加新的组和请求. 3.生成分享链接 4.导入分享链接

  3. java 手编线程池_死磕 java线程系列之自己动手写一个线程池

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...

  4. RabbitMQ 入门系列(2)— 生产者、消费者、信道、代理、队列、交换器、路由键、绑定、交换器

    本系列是「RabbitMQ实战:高效部署分布式消息队列」和 「RabbitMQ实战指南」书籍的读书笔记. RabbitMQ 中重要概念 1. 生产者 生产者(producer)创建消息,然后发送到代理 ...

  5. Bert系列(二)——源码解读之模型主体

    本篇文章主要是解读模型主体代码modeling.py.在阅读这篇文章之前希望读者们对bert的相关理论有一定的了解,尤其是transformer的结构原理,网上的资料很多,本文内容对原理部分就不做过多 ...

  6. Bert系列(三)——源码解读之Pre-train

    https://www.jianshu.com/p/22e462f01d8c pre-train是迁移学习的基础,虽然Google已经发布了各种预训练好的模型,而且因为资源消耗巨大,自己再预训练也不现 ...

  7. 最优化方法系列:Adam+SGD-AMSGrad 重点

    https://blog.csdn.net/wishchin/article/details/80567558 自动调参的Adam方法已经非常给力了,不过这主要流行于工程界,在大多数科学实验室中,模型 ...

  8. 边端云处理器系列技术参数

    边端云处理器系列技术参数 锐捷RG-CT7800系列云终端 基于兆芯开先® KX-6000系列处理器 特点: • 小身材 • 大能量 • 2.4L 机箱容量 • 强劲计算性能 简介: • 8核2.7G ...

  9. Camera系列规格参数

    Camera系列规格参数 FH8858V200: 新一代8M高性能网络摄像机 SoC FH8858V200是新一代面向8M专业型网络摄像机应用的高性能H.265/H.264/JPEG SoC芯片.芯片 ...

最新文章

  1. Codeforces Round #370 (Div. 2)
  2. ext.net 开发学习之FileUploadField与Image (四)
  3. XILINX资源获取
  4. python实现简单的api接口-对Python实现简单的API接口实例讲解
  5. gocron - 定时任务管理系统
  6. 恒生电子linux笔试题,恒生电子一面
  7. 安装 VMware Tools 实现窗口 自适应 及 主机与虚拟机之间复制粘贴
  8. django 登陆增加除了用户名之外的手机和邮箱登陆
  9. java web windows_Java Web服务器部署指南(windows版)
  10. Android官方开发文档Training系列课程中文版:分享简单数据之从其它APP接收简单数据
  11. png文件合并_png格式图片和jpg格式图片有什么区别?
  12. Aix vmstat命令解析
  13. python-pymysql模块的使用入门
  14. ACM_基础知识(二)
  15. Android 驱动开发(1)---Hello 实例
  16. android文本框自动补全,[Android]AutoCompleteTextView自动补全文本框
  17. STL_string.vector中find到的iterator的序号
  18. qt设置窗口不在任务栏上显示
  19. echarts饼图解析html标签,如图,用了echarts页面为什么不识别html标签?
  20. Light Field 光场以及Matlab光场工具包(LightField ToolBox)的使用说明

热门文章

  1. 报表控件Stimulsoft v2023.1全新发布 | 附免费下载试用
  2. Java面试题最新更新
  3. (11)高通AP10.4开发者指南——WLAN(2.5 代码流程)
  4. 用Python对用户评论典型意见进行数据挖掘
  5. 编写函数求特殊a串和
  6. 展望计算机体系结构的未来发展方向(学院作业)随便写的
  7. Vue的mixin混入
  8. 如果运气不好,就试试勇气
  9. 性能服务器石墨和化合物区别,南开大学陈军教授Nano Lett. :具有高容量和快速钠离子存储性能的硫化锑-石墨烯化合物...
  10. c语言学生成绩统计问题分析,统计计算学生成绩类有关问题ACing