iris 框架依赖注入使用
介绍
golang开发web应用一般会选个web框架开始开发,web框架提供了丰富的功能和特性,非常方便易用
golang官方提供的http包也可以快速启动http服务,但它提供的功能很少,不支持请求拦截、错误处理、日志处理、请求参数校验等常见的开发问题
golang的web框架很多,大部分也都很好用,像iris、gin、echo等在github上都是20k+star的项目
今天介绍一下iris这个框架,为什么选这个框架,因为这个框架有个非常好的特性——依赖注入(DI)
github地址:github.com/kataras/iri…
快速开始
下面是官方的例子,简单几行代码就可以启动http服务
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(推送,甚至是嵌入式数据)
-
• 中间件(Accesslog, Basicauth, CORS, gRPC, Anti-Bot hCaptcha, JWT, MethodOverride, ModRevision, Monitor, PPROF, Ratelimit, Anti-Bot reCaptcha, Recovery, RequestID, Rewrite)
-
• API版本管理
-
• MVC
-
• Websockets
-
• gRPC
-
• 独特的路由器,以动态路径作为参数,具有标准类型,如:uuid, :string, :int...和创建自己的能力
等,详情可以看官方文档
iris提供的这些功能,大部分web框架也都有支持
使用依赖注入(dependency injection)
type SignRequestModel struct {
Email string `json:"email"`
PassWord string `json:"pass_word"`
}
//SignUp方法依赖db,req对象自动解析http请求的参数(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 {
//新注册
} else {
//已注册
}
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,函数调用
app.Party("/api/v1").ConfigureContainer(container)
port := 8080
app.Listen(fmt.Sprintf(":%d", port), iris.WithOptimizations)
}
使用iris的依赖注入时,只需把依赖的对象通过 RegisterDependency 方法注册就可以使用了,非常方便简单
riis支持自动注入的对象还有很多,比如:
| Type | Maps To |
|---|---|
| *mvc.Application | Current MVC Application |
| iris.Context | Current Iris Context |
| *sessions.Session | Current Iris Session |
| context.Context | ctx.Request().Context() |
| *http.Request | ctx.Request() |
| http.ResponseWriter | ctx.ResponseWriter() |
| http.Header | ctx.Request().Header |
| time.Time | time.Now() |
| string, | |
| int, int8, int16, int32, int64, | |
| uint, uint8, uint16, uint32, uint64, | |
| float, float32, float64, | |
| bool, | |
| slice | Path Parameter |
| Struct | Request Body of JSON, XML, YAML, Form, URL Query, Protobuf, MsgPack |
tip: 如果提示ConfigureContainer 对象不存在的话,执行 github.com/kataras/iris/v12@master