本章我们将深入Nancy的内部,对Nancy的内部组件进行修改和调整。

那什么是bootstrap哪?字典里是这么介绍的:

一般而言,处于引导中(bootstrapping)是在终端用户可以使用之前开启软件或硬件的一种状态。    对于Nancy而言,引导过程(bootstrap)是应用程序刚刚开始启动到准备好应对服务请求这个过程中的发生的一连串事件。

一个自定义引导程序bootstrapper是开发人员自己定义的一个类,可以在应用开启时由Nancy的内核处理程序执行一些自定义选项或是过程。

这就好比好比买了辆二手汽车,然后调整发动机增加更多性能,添加一些内饰和新的收音机,根据自己的风格改进一些其他什么的。通过编写和使用自定义引导程序,就能给Nancy增加很多开箱即用的额外功能。

Nancy中采用引导程序(bootstrapper)主要有两方面的用途。首先是以方法的形式展现 钩子程序,配置选项以及其他用户级别的东西,开发人员可进行重载。其次是处理一些特定的任务,比如配置内置的Ioc容器(控制反转):TinyIOC ,提供对自己程序集的注册。

 Ioc容器

在我们继续探索前,我想先介绍下Nancy的隐含特征:内置Ioc容器。

对于那些还不了解Ioc的读者先简单介绍下概念。IoC(Inversion of Control​,控制反转)也称为依赖注入(Dependency Injection),是一种设计对象之间依赖关系的原则及其相关技术。当一个对象创建时,它所依赖的对象由外部传递给它,而非自己去创建所依赖的对象(比如通过new操作)。因此,也可以说在对象如何获取它的依赖对象这件事情上,控制权反转了。这种技术无外乎都是为了让软件更加高内聚低耦合。

对于基于Nancy的应用,Ioc容器也是用于自动装载依赖项。试看下面的路由模块:

using System;
using System.Collections.Generic;
using System.IO;
using Nancy;
using Nancy.Responses;
namespace nancybook.modules
{
public class BaseRoutes : NancyModule
{
private FakeDatabase _db;
public BaseRoutes()
{
Get[@"/"] = _ =>
{
var _db = new FakeDatabase();
var myList = db.GetHashCode();
return View["myview", myList];
};
}
}
}

这个例子很简单,但很有说明意义。

在这个模块中,FakeDatabase 是一个具体的依赖类(被引用的类)。这个比较难以管理,非常难以改变。试想你有20个这样的模块类,每个都定义了10条左右的URL,每个URL路由中都引用同样的数据访问库,每次使用时都需要创建一个新的实例。

假如你现在需要把FakeDatabase 修改为RealDatabase。然后你会突然意识这会涉及到多少工作量。

使用Ioc容器在这方面就能提升很多。如下:

using System;
using System.Collections.Generic;
using System.IO;
using Nancy;
using Nancy.Responses;
namespace nancybook.modules
{
public class BaseRoutes : NancyModule
{
private readonly FakeDatabase _db;
public BaseRoutes(FakeDatabase db)
{
_db = db;
Get[@"/"] = _ =>
{
var myList = _db.GetHashCode();
return View["myview", myList];
};
}
}
}

  

这个例子和之前的差不多,只是使用了Ioc容器来管理数据访问库。一个路由模块即使使用10次数据访问类,也只需要修改两个地方:一个是私有变量,另外是构造函数的参数。

Ioc容器会处理其他部分,包括在使用数据库访问类前,就给_db 装载正确的引用实例。

还有更好处理办法, 在Nancy的 bootstrapper类中,通过重载Ioc容器的默认设置,告诉Nancy在需要使用FakeDatabase对象时,使用RealDatabase对象进行替换。这样仅仅通过一个全局类中的修改,节省了每个路由模块中的两处修改。

Nancy可以使用很多种的Ioc容器,你可以通过NuGet来进行启用。如果你从来还接触过Ioc容器,也喜欢这种工作方式的话,内置的Ioc容器已经足够。

让我们把关注拉回到Bootstrapper类吧。

默认bootstrapper

关于重载和自定义类的讨论可能让你觉得实现这么一个Nancy bootstrapper需要大量的工作,也许是不值得的。

当然如果让你从零开始写这么一个类确实如此。然而Nancy的开发团队已经想到前头,为你提供了一个叫做DefaultNancyBootStrapper的类。

你得到一个自定义bootstrap类只需要简单继承下即可:

using System.Text;
using Nancy;
using Nancy.Bootstrapper;
namespace nancybook
{
public class CustomBootstrapper : DefaultNancyBootstrapper
{
}
}

在类主体中,你可以通过重载方法来加载自定义的功能实现方法。举个例子,你有一些外部数据库问代码库,其中使用到了泛型编程(方便共用相同的方法)。采用接口形式来定义基类,在不同的子类中实现具体功能,然后告诉Ioc容器去装载:

using System.Text;
using demodata;
using demodata.entities;
using Nancy;
using Nancy.Authentication.Forms;
using Nancy.Bootstrapper;
using Nancy.Conventions;
using Nancy.Session;
using Nancy.TinyIoc; namespace nancybook
{
public class CustomBootstrapper : DefaultNancyBootstrapper
{
protected override void ConfigureApplicationContainer(TinyIoCContainer
container)
{
base.ConfigureApplicationContainer(container);
container.Register<IDataProvider<Genre>>(new GenreDataProvider());
container.Register<IDataProvider<Album>>(new AlbumDataProvider());
container.Register<IDataProvider<Track>>(new TrackDataProvider());
container.Register<IDataProvider<Artist>>(new ArtistDataProvider());
}
}
}

在实际中,还会使用到很多的重载方法。比如在方法 RequestStartup 中配置表单验证,ConfigureRequestContainer 中配置自定义 IUserMapper ,ConfigureApplicationContainer 中注册外部的Ioc依赖项,ConfigureConventions 中设置网站应用中的静态文件夹,ApplicationStartup中处理异常。

一个自定义bootstrapper 示例

总结

NancyFX 第十一章 Bootstrapping的更多相关文章

  1. CPrimerPlus第十一章中的“选择排序算法”学习

    C Primer Plus第十一章字符串排序程序11.25中,涉及到“选择排序算法”,这也是找工作笔试或面试可能会遇到的题目,下面谈谈自己的理解. 举个例子:对数组num[5]={3,5,2,1,4} ...

  2. <构建之法>第十一章、十二章有感

    十一章:软件设计与实现 工作时要懂得平衡进度和质量.我一直有一个困扰:像我们团队这次做 男神女神配 社区交友网,我负责主页的设计及内容模块,有个队友负责网站的注册和登录模块,有个队友负责搜索模块,有个 ...

  3. sql 入门经典(第五版) Ryan Stephens 学习笔记 (第六,七,八,九,十章,十一章,十二章)

    第六章: 管理数据库事务 事务 是 由第五章 数据操作语言完成的  DML ,是对数据库锁做的一个操作或者修改. 所有事务都有开始和结束 事务可以被保存和撤销 如果事务在中途失败,事务中的任何部分都不 ...

  4. 第十一章 TClientDataSet

    第十一章 TClientDataSet 与TTable.TQuery一样,TClientDataSet也是从TDataSet继承下来的,它通常用于多层体系结构的客户端.TClientDataSet最大 ...

  5. 第十一章、认识与学习BASH

    第十一章.认识与学习 BASH 最近升级日期:2009/08/25 1. 认识 BASH 这个 Shell 1.1 硬件.核心与 Shell 1.2 为何要学文字接口的 shell 1.3 系统的合法 ...

  6. [Effective Java]第十一章 序列化

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. EFFECTIVE JAVA 第十一章 系列化

    EFFECTIVE  JAVA  第十一章  系列化(将一个对象编码成一个字节流) 74.谨慎地实现Serializable接口 *实现Serializable接口付出的代价就是大大降低了“改变这个类 ...

  8. 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高

    第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...

  9. [CSAPP笔记][第十一章网络编程]

    第十一章 网络编程 我们需要理解基本的客户端-服务端编程模型,以及如何编写使用因特网提供的服务的客户端-服务端程序. 最后,我们将把所有这些概念结合起来,开发一个小的但功能齐全的Web服务器,能够为真 ...

随机推荐

  1. 来了解并防范一下CSRF攻击提高网站安全

    看一下我从网上找的原理图,结合举例描述,多看一遍你就知道怎么回事了. CSRF是什么呢?CSRF全名是Cross-site request forgery,是一种对网站的恶意利用,CSRF比XSS更具 ...

  2. pycharm安装,svn使用,远程开发调试,接口测试,连接服务器

    磨刀不误砍柴工,配置完美的编辑器,在开发时,能帮助我们节约大量的时间成本,从而是我们的精力放在业务逻辑实现上面! 接下来将介绍 使用pyhcarm如何使用svn,远程开发调试,接口测试,已经连接远程服 ...

  3. 故障定位之查找附近点GeoHash研讨

    随着移动终端的普及,很多应用都基于LBS功能,附近的某某(餐馆.银行.妹纸等等). 基础数据中,一般保存了目标位置的经纬度:利用用户提供的经纬度,进行对比,从而获得是否在附近. 目标:查找附近的XXX ...

  4. Hadoop编译方法

    伪分布式: hadoop-env.sh core-site.xml hdfs-site.xml mapred-site.xml 1.在hadoop官网下载hadoop的源码(同步跟踪最新源代码) mv ...

  5. 网络基础tcp/ip协议三

    数据链路层:(位于网络层与物理层之间) 数据链路层的功能: 数据链路的建立,维护. 帧包装,帧传输,帧同步. 帧的差错恢复. 流量的控制. 以太网:(工作在数据链路层) CSMA/CD(带冲突检测的载 ...

  6. flask中jinjia2模板引擎详解4

    接上文 For循环 和其它编程语言一样,for用来编辑列表中的项.下面以一个例子来说明for在flask的jinjia2模板中的使用. 创建一个模板list.html 代码如下{% extends & ...

  7. 定义一个Matrix类,实现矩阵的加法和乘法

    #include<iostream> using namespace std; class Matrix { int row;//矩阵的行 int col;//矩阵的列 int **a;/ ...

  8. (转)Hanoi塔问题分析

    转自:http://shmilyaw-hotmail-com.iteye.com/blog/2077098 简介 关于Hanoi塔问题的分析,在网上的文章都写烂了.之所以打算写这篇文章,更多的是针对这 ...

  9. C#中windows服务安装方法

    关于windows服务的编写方法,参考:http://www.cnblogs.com/sorex/archive/2012/05/16/2502001.html 我这里就补充一下安装方法. 1.首先打 ...

  10. Ubuntu 11.04 NFS 配置

    安装 NFS 相关组件 sudo apt-get install nfs-kernel-server 增加 NFS 目录 sudo gedit /etc/exports #在文件中添加如下内容 /va ...