用Nancy和Simple.Data创建一个图片博客 第二部分:定义routes
2012-04-26 15:51
295 查看
前言:巴拉巴拉巴拉
前台需求:
访问主页观赏最新照片:
Route: /
Method: GET
访问指定照片,并观看评论:
Route: /photo/{slug}
Method: GET
对指定照片添加评论:
Route: /photo/{slug}/addcomment
Method: POST
访问所有的档案:
Route: /archives
Method: GET
访问某一年的档案:
Route: /archives/{year}
Method: GET
访问某年某月的档案:
Route: /archives/{year}/{month}
Method: GET
后台需求:
访问登录页面:
Route: /admin
Method: GET
登录到系统:
Route: /admin/login
Method: POST
访问照片列表:
Route: /admin/photos
Method: GET
添加照片:
Route: /admin/photos/add
Method: GET and POST
编辑照片:
Route: /admin/photos/edit/{slug}
Method: GET and POST
访问评论列表:
Route: /admin/comments
Method: GET
删除评论:
Route: /admin/comments/delete/{id}
Method: POST
好了,下面开始整理routes吧。
一个给homepage
一个给photo‘s
一个给档案archives
一个给admin
一个基类,提供共同的功能
在root创建一个目录叫做Modules,下面的Module都放在这个目录里。
基类module
现在基类还不需要做什么,但是当和数据库交互时,使用基类会增加方便性。我们使用抽象类,继承
这里面有两个构造函数,默认的构造函数我们已经熟悉,第二个接受一个参数,
The homepage module
直接看代码:
The photo module
这里就可以介绍刚才第二个构造函数的功能了。
OK,所有的Module(其实就是routes)都已经写好了。现在我们删除MainModule.cs,已经不需要了。
目录结构如下图:
步骤1:我们需要什么样的Routes?
这一步就是需求分析了。首先决定我们的应用需要暴露什么信息,以及用户如何交互。一旦了解后,就可以映射到一个route和方法(Get或者POST)。简单起见,我们把要求分为两部分:前台和后台。前台对任何人可见,后台给管理员使用。前台需求:
访问主页观赏最新照片:
Route: /
Method: GET
访问指定照片,并观看评论:
Route: /photo/{slug}
Method: GET
对指定照片添加评论:
Route: /photo/{slug}/addcomment
Method: POST
访问所有的档案:
Route: /archives
Method: GET
访问某一年的档案:
Route: /archives/{year}
Method: GET
访问某年某月的档案:
Route: /archives/{year}/{month}
Method: GET
后台需求:
访问登录页面:
Route: /admin
Method: GET
登录到系统:
Route: /admin/login
Method: POST
访问照片列表:
Route: /admin/photos
Method: GET
添加照片:
Route: /admin/photos/add
Method: GET and POST
编辑照片:
Route: /admin/photos/edit/{slug}
Method: GET and POST
访问评论列表:
Route: /admin/comments
Method: GET
删除评论:
Route: /admin/comments/delete/{id}
Method: POST
好了,下面开始整理routes吧。
步骤2:创建Modules
根据逻辑创建多个Module,分开Routes。一个给homepage
一个给photo‘s
一个给档案archives
一个给admin
一个基类,提供共同的功能
在root创建一个目录叫做Modules,下面的Module都放在这个目录里。
基类module
现在基类还不需要做什么,但是当和数据库交互时,使用基类会增加方便性。我们使用抽象类,继承
NancyModule,如下代码:
namespace Web.Modules
{
public abstract class BaseModule:NancyModule
{
public BaseModule():base()
{
}
public BaseModule(string modulePath):base(modulePath)
{
}
}
}
这里面有两个构造函数,默认的构造函数我们已经熟悉,第二个接受一个参数,
modulePath。等一会我们会见识她的功能。
The homepage module
直接看代码:
public class RootModule:BaseModule
{
public RootModule():base()
{
Get["/"] = parameters =>
{
return "Homepage";
};
}
}
The photo module
public PhotoModule()
: base("/photo")
{
Get["/{slug}"] = parameters =>
{
return String.Format("Photo {0}", parameters.slug);
};
Post["/{slug}/addcomment"] = parameters =>
{
string photoSlug = Convert.ToString(parameters.slug);
return Response.AsRedirect("/photo/" + photoSlug);
};
}
这里就可以介绍刚才第二个构造函数的功能了。
modulePath这个参数保证Get[]和Post[]都是相对于它的Url地址,也就是说:Get["/{slug}"]就是指的是Get["/photo/{slug}"]。
The archives module
public class ArchivesModule : BaseModule{
public ArchivesModule()
: base("/archives")
{
Get[""] = parameters =>
{
return "????";
};
Get["/{year}"] = parameters =>
{
return string.Format("{0}????", parameters.year);
};
Get["/{year}/{month}"] = parameters =>
{
return string.Format("{0}?{1}????", parameters.
year, parameters.month);
};
}
}
The admin module
public class AdminModule : BaseModule
{
public AdminModule()
: base("/admin")
{
Get[""] = parameters =>
{
return "Display the login form.";
};
Post["/login"] = parameters =>
{
// Perform validation, then redirect
return Response.AsRedirect("/admin/photos");
};
Get["/photos"] = parameters =>
{
return "A list of all the photo's.";
};
Get["/photos/add"] = parameters =>
{
return "Display the form to add a photo.";
};
Post["/photos/add"] = parameters =>
{
// Add the photo, then redirect
string slug = "newPhoto";
return Response.AsRedirect("/admin/photos/edit/"
+ slug);
};
Get["/photos/edit/{slug}"] = parameters =>
{
return String.Format("Display the form to edit a
photo called '{0}'.",
parameters.slug);
};
Post["/photos/edit/{slug}"] = parameters =>
{
// Edit the photo, then redirect
string slug = Convert.ToString(parameters.slug);
return Response.AsRedirect("/admin/photos/edit/"
+ slug);
};
Get["/comments"] = parameters =>
{
return "A list of all the comments.";
};
Post["/comments/delete/{id}"] = parameters =>
{
// Delete the comment, then redirect
return Response.AsRedirect("/admin/comments");
};
}
}
OK,所有的Module(其实就是routes)都已经写好了。现在我们删除MainModule.cs,已经不需要了。
目录结构如下图:
![](http://images.cnblogs.com/cnblogs_com/pieux/201204/201204261611555825.png)
相关文章推荐
- 用Nancy和Simple.Data创建一个图片博客 第三部分:渲染一些Views
- 用Nancy和Simple.Data创建一个图片博客 第一部分:开始一个工程
- ScottGu's 博客之--LINQ to SQL 第二部分-定义数据模型类--LINQ to SQL (Part 2 - Defining our Data Model Classes)
- Android 创建一个可拖拽图表-第二部分
- 如何创建一个Sencha Touch 2应用_笔记本案例(第二部分)
- J2EE实践第二部分-创建一个简单的EJB Web程序(盗梦空间版)
- 利用WhiteHose一步步建立分布式系统的框架(四)--创建AD步骤(定义AD的第二部分)
- (译)如何使用cocos2d制作一个滑动图片游戏教程:第二部分(完)
- 完成一个个人博客,博客头像可上传本地图片;部分图片实现点击看大图功能
- 使用Nancy和Simple.Data两个轻量级的框架打造一个分布式开发系统
- 使用Nancy和Simple.Data两个轻量级的框架打造一个分布式开发系统(一)
- WPF/E CTP Quick Start - 第二部分:创建一个XAML文件(翻译)
- WPF/E CTP Quick Start - 第二部分:创建一个XAML文件(翻译)
- Macriomedia Flex入门教程第二部分――创建一个简单的计算器
- 使用Nancy和Simple.Data两个轻量级的框架打造一个分布式开发系统
- 如何创建一个类似 Instagram 的使用 Web Service 作后台的应用 第二部分
- 给phpcms v9加入一个主题radio无线电button,它可反复使用,以创建不同的专题部分内容编辑器,添加一个主题来定义自己的领域
- WPF/E CTP Quick Start - 第二部分:创建一个XAML文件(翻译)
- 创建一个包,其中定义一个过程,可以查询得到编号为7900的员工的姓名ename、薪水sal、佣金comm、上司编号mgr (通过OUT类型的参数将结果返回并打印) (注意包有包头部分的声明和包体部分的
- ScottGu之博客翻译-第6部分-用存储过程检索数据-LINQ to SQL (Part 6 - Retrieving Data Using Stored Procedures)