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

  1. 自底向上全套都是新构建的,移除了对其他框架的引用和限制。
  2. Run anywhere. Nancy 能够在ASP.NET/IIS,OWIN,Self-hosting中运行。
  3. 集成支持各种View engine(Razor, Spark, dotLiquid, SuperSimpleViewEngine...)
  4. 一个强力而且轻量级的测试框架。
  5. 内容协商。
  6. 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; }
}

つづく

 
分类: C#

Nancy的更多相关文章

  1. Nancy之大杂烩

    Nancy关于Hosting的简单介绍 一. Nancy之基于Nancy.Hosting.Aspnet的小Demo 二.Nancy之基于Nancy.Hosting.Self的小Demo 三.Nancy ...

  2. Nancy之实现API的功能

    0x01.前言 现阶段,用来实现API的可能大部分用的是ASP.NET Web API或者是ASP.NET MVC,毕竟是微软官方出产的,用的人也多. 但是呢,NancyFx也是一个很不错的选择.毕竟 ...

  3. 第二章 Rest框架 Nancy

    正如你看到的,Nancy有两个主要用途. 其中第一项是作为一种通用的基于 REST 框架,可替代 ASP.NET Web API 或其他Rest工具包. 默认情况下,Nancy提供一流的路由和内容协商 ...

  4. 在Linux中运行Nancy应用程序

    最近在研究如何将.NET应用程序移植到非Windows操作系统中运行,逐渐会写一些文章出来.目前还没有太深的研究,所以这些文章大多主要是记录我的一些实验. 这篇文章记录了我如何利用NancyFx编写一 ...

  5. [Nancy On .Net Core Docker] 轻量级的web框架

    .net core现在已经有了大的发展,虽然笔者现在已经从事python开发,但是一直在关注.net的发展,在逛博客园的时候,发现有大家都会提到Nancy这个框架,在简单的使用之后,发现竟然是如此的简 ...

  6. Nancy之基于Nancy.Hosting.Aspnet的小Demo

    近来学习了一下Nancy这个框架,感觉挺好用的,就写篇简单的文章记录一下大致用法,由于是刚接触,写的代码 可能不规范,也没有具体的分层..莫吐槽... Nancy的官网:http://nancyfx. ...

  7. Nancy之基于Nancy.Hosting.Self的小Demo

    继昨天的Nancy之基于Nancy.Hosting.Aspnet的小Demo后, 今天来做个基于Nancy.Hosting.Self的小Demo. 关于Self Hosting Nancy,官方文档的 ...

  8. Nancy之基于Nancy.Owin的小Demo

    前面做了基于Nancy.Hosting.Aspnet和Nancy.Hosting.Self的小Demo 今天我们来做个基于Nancy.Owin的小Demo 开始之前我们来说说什么是Owin和Katan ...

  9. Nancy之基于Self Hosting的补充小Demo

    前面把Hosting Nancy with ASP.NET.Self Hosting Nancy和Hosting Nancy with OWIN 以demo的形式简单描述了一下. 这篇是为Self H ...

  10. Nancy之静态文件处理

    今天我们来谈谈Nancy中的静态文件(JavaScript,CSS等)该如何处理. 在前面的Demo中,我们也已经用到了这一块的内容, 但并没有深入理解,只是停留在使用的层面上. 在进入今天的正题之前 ...

随机推荐

  1. Get与Post的差别

    Http定义了与server交互的不同方法,最主要的方法有4种,各自是GET,POST.PUT,DELETE. URL全称是资源描写叙述符.我们能够这样觉得:一个URL地址,它用于描写叙述一个网络上的 ...

  2. SWT中Display和Shell是个什么东东

    Display:与操作系统沟通的桥梁 我们在前面说过,每个swt程序在最开始都必须创建一个Display对象.Display对象起什么作用呢?它是swt与操作系统沟通的一座桥梁.它负责swt和操作系统 ...

  3. linq 中执行方法

    Database1Entities db = new Database1Entities(); protected void Page_Load(object sender, EventArgs e) ...

  4. 局部敏感哈希-Locality Sensitive Hashing

    局部敏感哈希 转载请注明http://blog.csdn.net/stdcoutzyx/article/details/44456679 在检索技术中,索引一直须要研究的核心技术.当下,索引技术主要分 ...

  5. 基于VLC的视频播放器

    原文:基于VLC的视频播放器 最近在研究视频播放的功能,之前是使用VideoView.在网上看了一下,感觉不是很好,支持的格式比较少,现在网络视频的格式各种各样,感觉用VideoView播放起来局限性 ...

  6. 《实验数据的结构化程序设计》 2.4.4Calendar个人意见,寻求指引

    题目大意: 制作一个日历系统,输入年份.一些周年纪念日,及服务要求日期,依据要求日期输出,输出重要程度小于发生日期的周年纪念日. 题目地址: UVA  145 个人见解: 纯模拟,在闰年,输出顺序及输 ...

  7. Codeforces Round #256 (Div. 2) A. Rewards

    A. Rewards time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  8. HDU 3836 Equivalent SetsTarjan+缩点)

    Problem Description To prove two sets A and B are equivalent, we can first prove A is a subset of B, ...

  9. 北邮iptv用WindowsMediaplayer打不开的解决的方法

    前言:之前我的iptv能够用,可是有次我安装了realplayer,它就偷偷把iptv文件的默认打开方式给篡改了,卸载了                  realplayer之后,iptv不能直接用 ...

  10. 使用Emacs muse制作幻灯片

    PPT太受欢迎.总是必要的交流会议.我看到一个很酷javascript实现,取代PPT. 不过还是很喜欢Emacs要做的事,即使文件难听点. 现在,用muse slidy, 一大区别. 简单的说mus ...