.NET Nancy 详解(一) 初识
Nancy 是一个轻量级的,简单粗暴的framework用来构建基于HTTP的各种服务,兼容.Net和Mono。Nancy的整套设计理念是基于"super-duper-happy-path",这是一个作者杜撰的单词,个人觉得翻译过来基本就是简单粗暴,行之有效的意思。
简单的例子:
public class Module : NancyModule
{
public Module()
{
Get["/greet/{name}"] = x => {
return string.Concat("Hello ", x.name);
};
}
}
github上的例子后面跟着的是Compile, run and enjoy the simple, elegant design!,这句话让我深深的感受到这群程序员的可爱。
Features
- 自底向上全套都是新构建的,移除了对其他框架的引用和限制。
- Run anywhere. Nancy 能够在ASP.NET/IIS,OWIN,Self-hosting中运行。
- 集成支持各种View engine(Razor, Spark, dotLiquid, SuperSimpleViewEngine...)
- 一个强力而且轻量级的测试框架。
- 内容协商。
- And much, much more
如果本文就这样结束了,那和其他介绍的文字就没有多大的区别了。让我们坐上github的时光机,开始我们的扒皮之旅。
第一站:version-20101128

这个时候的Nancy 就如同一个刚出生的婴儿,也正因为如此,才便于我们入手。入口点当然是大家耳熟能详的IHttpHandler。这里的IsReusable可是false的,有一定的性能损失,这里的知识点大家可以参见另外的博文。
public class NancyHttpRequestHandler : IHttpHandler
{
public bool IsReusable
{
get { return false; }
}
public void ProcessRequest(HttpContext context)
{
//...
}
}
既然刚出生,自然问题很多,就如同下面的代码,这里本着不吐槽的原则,只是笑而不语,恩恩。
public void ProcessRequest(HttpContext context)
{
var url = context.Request.Url.AbsolutePath;
if (url.Contains("favicon.ico"))
{
return;
}
var request = CreateNancyRequest(context);
var assembly =
context.ApplicationInstance.GetType().BaseType.Assembly;
var engine =
new NancyEngine(new NancyModuleLocator(assembly), new RouteResolver());
var response = engine.HandleRequest(request);
SetNancyResponseToHttpResponse(context, response);
}
值得赞赏的是单元测试一开始就跟上了项目进度,这样方便我们去研究其代码的意图。其中比较有意思的是Response类的实现,里面使用了隐式的类型转换,用来实现无论是HttpStatusCode还是Content都直接用=赋值即可,当然这么做会带来一定的副作用。
public void Should_set_status_code_when_implicitly_cast_from_int()
{
// Given, When
Response response = 200;
// Then
response.StatusCode.ShouldEqual(HttpStatusCode.OK);
}
public void Should_set_status_code_when_implicitly_cast_from_http_status_code()
{
// Given, When
Response response = HttpStatusCode.NotFound;
// Then
response.StatusCode.ShouldEqual(HttpStatusCode.NotFound);
}
public void Should_return_contents_when_implicitly_cast_to_string()
{
// Given
const string value = "test value";
Response response = value;
// When
String output = response;
// Then
output.ShouldEqual(value);
}
具体的隐式转换倒是没啥内容。
public static implicit operator Response(HttpStatusCode statusCode)
{
return new Response { StatusCode = statusCode };
}
public static implicit operator Response(int statusCode)
{
return new Response { StatusCode = (HttpStatusCode)statusCode };
}
public static implicit operator Response(string contents)
{
return new Response { Contents = contents, ContentType = "text/html", StatusCode = HttpStatusCode.OK };
}
public static implicit operator string(Response response)
{
return response.Contents;
}
Request
对于Request 的包装暂时只是占了个坑,后续版本有补充cookie的一些操作在这里。
public interface IRequest
{
string Path { get; }
string Verb { get; }
}
public class Request : IRequest
{
public Request(string verb, string path)
{
this.Path = path;
this.Verb = verb;
}
public string Path { get; private set; }
public string Verb { get; private set; }
}
つづく
.NET Nancy 详解(一) 初识的更多相关文章
- .NET Nancy 详解(三) Respone 和 ViewEngine
我们在ASP.NET MVC中可以返回各种类型的ActionResult(以下图片来自于园友--待补..) 在Nancy 中本着简单粗暴的原则,使用方式略有不同.这期我们使用的版本是Nancy的第一个 ...
- .NET Nancy 详解(四) Self Host
Self Host 使得Nancy 能够在任意application 中启动,无论是console 还是windows service.这期我们使用的版本是Nancy v0.4.0. Demo 首先看 ...
- .NET Nancy 详解(二) 简易路由实现
继续上面的简易版本,有意思的点剩下便是路由实现了. 路由注册 首先,来看一下基本的路由注册过程. public FakeNancyModuleWithoutBasePath() { Delete[&q ...
- RxJava2.0的使用详解
RxJava2.0的使用详解 1,初识RxJava RxJava就是一种用Java语言实现的响应式编程,来创建基于事件的异步程序 RxJava是一个基于事件订阅的异步执行的一个类库,目前比较火的一些技 ...
- web标准 浏览器介绍 开发工具介绍 HTML介绍 HTML颜色介绍 规范 HTML结构详解 {前端之前端初识}
前端之前端初识 前端初识 本节目录 一 web标准 二 浏览器介绍 三 开发工具介绍 四 HTML介绍 五 HTML颜色介绍 六 规范 七 HTML结构详解 一 web标准 web准备介绍: 1. ...
- MYSQL之数据库初识、安装详解、sql语句基本操作
目录 MYSQL之数据库初识及安装详解 1.什么是数据库? 1.什么是数据?(data) 2.什么是数据库?(databases,简称DB) 2.为什要用数据库? 3.什么是数据库管理系统?(Data ...
- NopCommerce源码架构详解--初识高性能的开源商城系统cms
很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从中学习很多企业系统.软件开发的规范和一些新的技术.技巧,可以快速地提高我们 ...
- nginx平台初识(二) 浏览器 HTTP 协议缓存机制详解
1.缓存的分类 缓存分为服务端侧(server side,比如 Nginx.Apache)和客户端侧(client side,比如 web browser). 服务端缓存又分为 代理服务器缓存 和 反 ...
- java架构之路-(分布式)初识zookeeper安装与参数详解
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...
随机推荐
- 线程池大小 & cpu core
http://stackoverflow.com/questions/14556037/number-of-processor-core-vs-the-size-of-a-thread-pool ht ...
- ADO.NET中的五个主要对象
Connection:主要是开启程序和数据库之间的连接.没有利用连接对象将数据库打开,是无法从数据库中取得数据的.Close和Dispose的区别,Close以后还可以Open,Dispose以后则不 ...
- Debian上安装Apache+Django全过程
-->start sudo apt-get install apache2 libapache2-mod-wsgi #https://wiki.debian.org/zh_CN/Apache s ...
- struts2 基础demo1
我们都知道 struts2 是基于webframework 出现的 优秀的mvc 框架, 他和struts1 完全没有联系.struts2 是一个框架, 啥叫框架呢?是一个优秀的半成品 . web的框 ...
- 1.把二元查找树转变成排序的双向链表[BST2DoubleLinkedList]
[题目]:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 比如将二元查找树 . 10 / \ 6 14 / \ / \ 4 8 12 16 转 ...
- zpf 获取表单等数据的用法
2015年4月12日 12:25:35 星期日 zpf框架中获取表单数据的方法 //获得get,post,url中的数据 private function setData() { $this-> ...
- Python字符编码
http://www.runoob.com/python/python-strings.html ASCII Unicode UTF-8 # -*- coding: utf-8 -*- 格式化 %运算 ...
- [Android] RelativeLayout, LinearLayout,FrameLayout
Android RelativeLayout 属性 // 相对于给定ID控件 android:layout_above 将该控件的底部置于给定ID的控件之上; android:layout_below ...
- nyoj_31
题目描述:五个数求最值. #include <iostream> #include <algorithm> using namespace std; int main(){ ] ...
- 通过JavaScript操作HTML中select标签
添加: Js代码 1.function selectChange() 2.{ 3.var sel=document.getElementById("select1"); 4. Op ...