由于revel框架本身对于model层的编写没有提供任何指导,所以在设计这部分的时候就有些犹豫,反复斟酌到底怎样才算是最佳实践。

我在做山坡网的时候刚开始也纠结了一下,拿不准mongodb的session的创建和销毁应该在什么地方处理。直到有一天看到了revmgo的作者在与revel的作者讨论(具体内容在这里),就去研究了下revmgo,之后立即就用它替换了我自己的实现。

先说下用法吧。

1. 在app.conf添加mongodb的连接字符串。

revmgo.dial = mongodb://username:password@serverip/database

2. 在controller层的init方法中初始化。

func init() {
  revmgo.ControllerInit()

  revel.OnAppStart(func() {
    revmgo.AppInit()
  }
}

3. 把MongoController签入到所有需要访问数据库的Controller中。

type Application struct {
  *revel.Controller
  revmgo.MongoController
}

这里有个小插曲,revmgo.MongoController已经内嵌过revel.Controller了,但此处还是不能省略*revel.Controller。原因是revel在确定有效的controller的action的时候只反射了一层,跟revel的作者讨论过这个问题,后来他说服我了,原因是如果不断递归反射的话复杂度会变高而且性能损失会不可控。好吧,其实这也算是OO的遗毒。看起来挺难受,多写了一行代码,设计上也不太舒服,但仔细想来对性能和整体的复杂度却都有好处,既然如此,何必执着设计上的完美呢?简单就是美。

4. 修改Dal的实现。

//Data access layer
type Dal struct {
  session *mgo.Session
}

//创建新的Dal
func NewDal(session *mgo.Session) *Dal {
  if session == nil {
    panic("session cannot be nil.")
  }
  return &Dal{session}
}

现在来看看在controller中如何使用。

func (c *Account) HandleRegister(user *models.MockUser) revel.Result {
  //Validate parameter here.
  dal := models.NewDal(c.MongoSession)
  err := dal.RegisterUser(user)
  //Biz logic here
}

revmgo的内部实现非常简单,整个代码也就110行,基本可以一目了然。

总的来说,调用revmgo.AppInit()的时候读取app.conf中的配置,可以看到有两个配置项有效,"revmgo.dial"为连接字符串,"db.spec"确定mongodb的session的重复利用方式(具体含义参考这里),然后建立session。

之后的revmgo.ControllerInit注册了两个interceptfunc,用于在controller的action访问前后建立和关闭session。

func ControllerInit() {
  revel.InterceptMethod((*MongoController).Begin, revel.BEFORE)
  revel.InterceptMethod((*MongoController).End, revel.FINALLY)
}

其实我对于这个设计颇有微词,ControllerInit的存在简直就是对revel的module设计机制的嘲笑,很难相信作为一个模块竟然还需要使用者手动调用初始化函数。这个部分应该不难处理,常规来说只应该让使用者注册需要使用的module和执行顺序,初始化和解构都由module管理器负责。跟revel的作者也讨论了这个问题,看他似乎有别的设计意图,等等看revel 1.0正式发布时会是什么样子吧。

Go语言实战 - revel框架教程之MongDB的最佳搭档revmgo的更多相关文章

  1. Go语言实战 - revel框架教程之CSRF(跨站请求伪造)保护

    CSRF是什么?请看这篇博文“浅谈CSRF攻击方式”,说的非常清楚. 现在做网站敢不防CSRF的我猜只有两种情况,一是没什么人访问,二是局域网应用.山坡网之前属于第一种情况,哈哈,所以至今没什么问题. ...

  2. revel框架教程之CSRF(跨站请求伪造)保护

    revel框架教程之CSRF(跨站请求伪造)保护 CSRF是什么?请看这篇博文“浅谈CSRF攻击方式”,说的非常清楚. 现在做网站敢不防CSRF的我猜只有两种情况,一是没什么人访问,二是局域网应用.山 ...

  3. Go语言实战 - revel框架教程之权限控制

    一个站点上面最基本都会有三种用户角色,未登录用户.已登录用户和管理员.这一次我们就来看看在revel框架下如何进行权限控制. 因为revel是MVC结构的,每一个url其实都会映射到一个具体的Cont ...

  4. Go语言实战 - revel框架教程之用户注册

    用户注册.登录和注销是任何一个网站都必然会有的功能,可以说,这是重新造轮子做多的领域,每个做网站的人应该都做过很多遍.见微知著,从这么一个小功能其实就可以看到所使用的web框架中的大部分东西. 今天就 ...

  5. Go语言实战 - revel框架教程之缓存和Job

    所有的网站应该都会有一个非常简单的需求,首页一秒之内打开. 满足的方式主要有两种: 页面静态化,效果最好,对服务器基本没负担,只要带宽足够就好了.我知道一个PV过亿的站点就是全站静态(以前新浪也是), ...

  6. revel框架教程之缓存和Job

    Go语言实战 - revel框架教程之缓存和Job   所有的网站应该都会有一个非常简单的需求,首页一秒之内打开. 满足的方式主要有两种: 页面静态化,效果最好,对服务器基本没负担,只要带宽足够就好了 ...

  7. revel框架教程之权限控制

    Go语言实战 - revel框架教程之权限控制 一个站点上面最基本都会有三种用户角色,未登录用户.已登录用户和管理员.这一次我们就来看看在revel框架下如何进行权限控制. 因为revel是MVC结构 ...

  8. HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID

    HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID HealthKit开发准备工作 在开发一款HealthKit应用程序时,首先需要讲解HealthKit中有哪些类,在i ...

  9. Swift2.0语言教程之Swift2.0语言中的标准函数

    Swift2.0语言教程之Swift2.0语言中的标准函数 Swift2.0中的标准函数 函数除了可以根据参数列表的有无分为无参函数和有参函数,还可以从定义角度分为用户自定义函数和标准函数两种.以上的 ...

随机推荐

  1. linux 命令 ---- 同步当前服务器时间

    原因:昨天临走前,虚拟机没有关机,是挂起状态,然后今天来的时候,发现数据库表中存(更新)的时间,不是系统时间, 解决:先运行起我们的虚拟机, (对于asterisk) 1.先查看当前服务器(linux ...

  2. SpringMVC(一) SpringMVC概述

    SpringMVC为展现层提供的基于MVC设计理念的优秀的WEB框架,是目前主流的MVC框架之一.Spring 3.0之后,超越Struts2成为最优秀的MVC框架. SpringMVC通过一套MVC ...

  3. Mybatis拦截器

    Mybatis拦截器

  4. Future和Promise

    Future用于获取异步操作的结果,而Promise则比较抽象,无法直接猜测出其功能. Future Future最早来源于JDK的java.util.concurrent.Future,它用于代表异 ...

  5. wpf 触发器理解

    (1)属性触发器:其对应的类是Trigger.它在特定关联属性发生变化时被触发.一个属性的更改会在另一个属性中触发即时或动态更改. (2)数据触发器:其对应的类是DataTrigger.它在特定的CL ...

  6. 【虚拟机】oracle Virtual Box4.2.6虚拟机正在运行的过程中删除了其上的一个备份,之后虚拟机就无法使用了

    原因未知,解决方法没有,网上也没有找到相关的解决方法.偶然的操作导致

  7. 如何在Web引用中使用项目自定义的类

    这个是老架构了,不推荐现在这么用,维护一个老项目记录一下. 项目中WebService和客户端是在一个解决方案下,实体类是一个公用的Project,如果使用Web引用自动生成的类会缺少一些实体类定义的 ...

  8. [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)

    再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...

  9. bzoj3631树链剖分

    虽然是水题1A的感觉太爽了O(∩_∩)O~ 题意相当于n-1次树上路径上每个点权值+1,最后问每个点的权值 本来想写线段树,写好了change打算框架打完了再来补,结果打完发现只是区间加和单点查 前缀 ...

  10. 【第一课】WEBIX 入门自学-介绍WEBIX

    Webix是跨浏览器.跨平台的JavaScript框架,使用JavaScript.CSS,HTML5技术构建交互式web应用程序.库中提供几十个完全可定制的组件,提供了JQuery集成和可以处理任何服 ...