iris 框架依赖注入使用

654 阅读2分钟

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支持自动注入的对象还有很多,比如:

TypeMaps To
*mvc.ApplicationCurrent MVC Application
iris.ContextCurrent Iris Context
*sessions.SessionCurrent Iris Session
context.Contextctx.Request().Context()
*http.Requestctx.Request()
http.ResponseWriterctx.ResponseWriter()
http.Headerctx.Request().Header
time.Timetime.Now()
string,
int, int8, int16, int32, int64,
uint, uint8, uint16, uint32, uint64,
float, float32, float64,
bool,
slicePath Parameter
StructRequest Body of JSON, XML, YAML, Form, URL Query, Protobuf, MsgPack

详情参考:github.com/kataras/iri…

tip: 如果提示ConfigureContainer 对象不存在的话,执行 github.com/kataras/iris/v12@master