iris 框架依賴注入使用
介紹
golang開(kāi)發(fā)web應(yīng)用一般會(huì)選個(gè)web框架開(kāi)始開(kāi)發(fā),web框架提供了豐富的功能和特性,非常方便易用
golang官方提供的http包也可以快速啟動(dòng)http服務(wù),但它提供的功能很少,不支持請(qǐng)求攔截、錯(cuò)誤處理、日志處理、請(qǐng)求參數(shù)校驗(yàn)等常見(jiàn)的開(kāi)發(fā)問(wèn)題
golang的web框架很多,大部分也都很好用,像iris、gin、echo等在github上都是20k+star的項(xiàng)目
今天介紹一下iris這個(gè)框架,為什么選這個(gè)框架,因?yàn)檫@個(gè)框架有個(gè)非常好的特性——依賴注入(DI)
github地址:https://github.com/kataras/iris
快速開(kāi)始
下面是官方的例子,簡(jiǎn)單幾行代碼就可以啟動(dòng)http服務(wù)
package?main
import?"github.com/kataras/iris/v12"
func?main()?{
??app?:=?iris.New()
??app.Use(iris.Compression)
??app.Get("/",?func(ctx?iris.Context)?{
????ctx.HTML("Hello?<strong>%s</strong>!",?"World")
??})
??app.Listen(":8080")}iris還支持其他很多特性,比如:
??HTTP/2(推送,甚至是嵌入式數(shù)據(jù))
??中間件(Accesslog, Basicauth, CORS, gRPC, Anti-Bot hCaptcha, JWT, MethodOverride, ModRevision, Monitor, PPROF, Ratelimit, Anti-Bot reCaptcha, Recovery, RequestID, Rewrite)
??API版本管理
??MVC
??Websockets
??gRPC
??獨(dú)特的路由器,以動(dòng)態(tài)路徑作為參數(shù),具有標(biāo)準(zhǔn)類(lèi)型,如:uuid, :string, :int...和創(chuàng)建自己的能力
等,詳情可以看官方文檔
iris提供的這些功能,大部分web框架也都有支持
使用依賴注入(dependency injection)
type?SignRequestModel?struct?{
????Email?string?`json:"email"`
????PassWord?string?`json:"pass_word"`
}
//SignUp方法依賴db,req對(duì)象自動(dòng)解析http請(qǐng)求的參數(shù)(application/json)
func?SignUp(db?*gorm.DB,?req?SignRequestModel)?interface{}?{
????user?:=?&repository.User{}
????tx?:=?db.Model(&repository.User{}).Where(&repository.User{Email:?req.Email}).First(user)
????if?err?:=?tx.Error;?err?!=?nil?{
????????return?util.FailureResponse(err)
????}
????if?user?==?nil?{
????????//新注冊(cè)
????}?else?{
????????//已注冊(cè)
????}
????return?util.SuccessResponse("ok")
}
func?container(api?*iris.APIContainer)?{
????//注入依賴
????api.RegisterDependency(db)
????api.Post("/sign/up",?SignUp)
}
func?main()?{
????app?:=?iris.New()
????app.Use(recover.New())
????app.Use(irisLog.New())
????//非mvc,函數(shù)調(diào)用
????app.Party("/api/v1").ConfigureContainer(container)
????port?:=?8080
????app.Listen(fmt.Sprintf(":%d",?port),?iris.WithOptimizations)
}使用iris的依賴注入時(shí),只需把依賴的對(duì)象通過(guò)?RegisterDependency?方法注冊(cè)就可以使用了,非常方便簡(jiǎn)單
riis支持自動(dòng)注入的對(duì)象還有很多,比如:
TypeMaps To*mvc.ApplicationCurrent MVC Applicationiris.ContextCurrent Iris Context*sessions.SessionCurrent Iris Sessioncontext.Contextctx.Request().Context()*http.Requestctx.Request()http.ResponseWriterctx.ResponseWriter()http.Headerctx.Request().Headertime.Timetime.Now()string,int, int8, int16, int32, int64,uint, uint8, uint16, uint32, uint64,float, float32, float64,bool,slicePath ParameterStructRequest Body?of?JSON,?XML,?YAML,?Form,?URL Query,?Protobuf,?MsgPack
詳情參考:https://github.com/kataras/iris/wiki/dependency-injection
tip: 如果提示ConfigureContainer 對(duì)象不存在的話,執(zhí)行?github.com/kataras/iris/v12@master
