Macaron的注入struct

#web服务器html

浏览一个网页就像买啤酒,你给我钱(http请求),我给你啤酒(http返回)
web服务器就充当了营业员的角色
买啤酒从宏观来看,就2步,一手交钱一手交货。其实营业员在给你啤酒以前,还作了其余的事情,好比验钞和查看库存等。而且是有前后顺序的,通常是验钞经过后,再去查看库存。
web服务器也同样,它收到浏览器发来的请求后,会按预约设计的顺序来作一个一个的function,最后将处理的结果返回给浏览器。浏览器拿到返回的内容(html源码),就能够画在屏幕上给用户看了。git

#macaron.Usegithub

Use方法,就是用来注册一个一个的func的,这些func是全局的,也就是任何http请求过来,会最早调用这些func,以此执行。注册的顺序也就是执行的顺序。
Use方法可使用屡次,但每次只能注册一个func。web

m.Use(func(){
    println(1)
})
m.Use(func(){
    println(2)
})
// 任何http请求过来,会先打印1,再打印2在控制台上

#macaron.Get浏览器

Get方法也是来注册与上面Use同样的func的,Get方法注册的func 会在 Use注册的func执行完毕后,再依次执行。
Get方法只能使用1次(相同pattern的状况下),能够同时注册1个或n个func,用逗号隔开服务器

m.Get("/",func(){
        println(3)
    },
    func(){
        println(4)
    })
// 若是访问的是“/”,会再继续打印3和4在控制台上

到目前为止,尚未注入任何东西,因此只能用macaron.Context.net

m := macaron.Classic() 事实上用经典模式已经帮你注入了一些了。先看成没有注入来看

#开始注入设计

先注入一个Student的structcode

// 这里是Student的定义,之后再也不说了
type Student struct {
Id   int
Name string
}

func (s *Student) GetName() string {
	return s.Name
}

func (s *Student) Job() {
	fmt.Println("study..")
}

注入的func,这里的注入,就至关于注册参数,使用Map的方法来注册参数htm

ctx.Map("arg2") //注册string类型的参数为arg2
ctx.Map(s) //注册Student类型的参数为s(也就是小明的那个实例)
// 关于注入,看http://my.oschina.net/u/943306/blog/500237

代码:

func MidStruct(opt string) macaron.Handler {
    var s *Student
    if opt == "xm" {
        s = &Student{Id: 1, Name: "xiao ming"}
    } else {
        s = &Student{Id: 1, Name: "xiao wang"}
    }
    
    return func(ctx *macaron.Context) {
        ctx.Map(s)  //关键语句,用于注入struct
    }
}

执行注入

m.Use(MidStruct("xm")) //执行注入动做

使用struct

// 若是以前注入过,那以后就能够取到被注入的struct了
    m.Get("/",func(){
        println(3)
    },
    func(){
        println(4)
    },
    func(s *Student){  //由于以前注入过了,因此这里直接用不会报错
        s.Job() //打印完上面的4后,会再打印一行study..
    })

这里的最后一个func,就至关于(http://my.oschina.net/u/943306/blog/500237#OSC_h1_9) 里的f2

#完整代码

package main

import (
	"fmt"
	"github.com/Unknwon/macaron"
)

func main() {

	m := macaron.Classic()
	m.Use(MidStruct("xm"))

	m.Get("/", func(ctx *macaron.Context, s *Student) {
		fmt.Println(s.GetName())
		s.Job()
	})

	m.Run()
}

func MidStruct(opt string) macaron.Handler {
	var s *Student
	if opt == "xm" {
		s = &Student{Id: 1, Name: "xiao ming"}
	} else {
		s = &Student{Id: 1, Name: "xiao wang"}
	}

	return func(ctx *macaron.Context) {
		ctx.Map(s)
	}
}

type Student struct {
	Id   int
	Name string
}

func (s *Student) GetName() string {
	return s.Name
}

func (s *Student) Job() {
	fmt.Println("study..")
}
相关文章
相关标签/搜索