上一篇博客 留下了一个悬念,这篇我们就来解决它。
话不多说直接上代码
handler 目录 uaa.go 的代码 改动如下
package handler
import (
"golang.org/x/net/context"
)
type UaaHandler interface {
Login(ctx context.Context, req *LoginReq, rsp *LoginRsp) error
}
type uaa struct {
}
func newUaaHandler() UaaHandler {
return &uaa{}
}
type LoginReq struct{}
type LoginRsp struct {
Id string `json:"id"`
Name string `json:"name"`
}
func (u *uaa) Login(ctx context.Context, req *LoginReq, rsp *LoginRsp) error {
rsp.Id, rsp.Name = "1", "小明"
return nil
}
handle 目录下 新建 app.go ,代码如下
package handler
type App struct {
Uaa UaaHandler
}
func NewApp() *App {
return &App{Uaa: newUaaHandler()}
}
router 目录下 router.go 代码如下
package router
import (
"ginWeb/handler"
"github.com/gin-gonic/gin"
)
func InitRoutes(app *handler.App) *gin.Engine {
router := gin.New()
root := router.Group("/gin-web")
v1 := root.Group("v1")
uaa := &uaa{app.Uaa}
uaa.addRouter(v1)
return router
}
main.go 代码改动如下
package main
import (
"ginWeb/handler"
router2 "ginWeb/router"
"log"
"net/http"
)
func main() {
router := router2.InitRoutes(handler.NewApp())
srv := &http.Server{
Addr: ":8080",
Handler: router,
}
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("listen: %s\n", err)
}
}
然后运行 go run main.go
执行 curl -XPOST http://127.0.0.1:8080/gin-web/v1/uaa/login
会出现 {"id":"1","name":"小明"}% 表示成功
小结一下
上述代码用通过注入的方式 将业务层模型注入到 api层,这样api不需要显示的去New 新的业务层模型,业务层的模型 也不需要提供显示的New方法,调用上更加安全
依赖注入(Dependency Injection,DI)是一种软件设计模式,用于实现松耦合(Loose Coupling)的组件之间的关系。在依赖注入中,组件之间的依赖关系不是在组件内部硬编码实现的,而是通过外部传入的方式进行注入,从而使得组件更容易被替换、扩展和测试。
依赖注入的实现可以通过构造函数注入、接口注入、属性注入等方式。通过依赖注入,可以将组件之间的依赖关系外部化,在需要替换具体实现或者进行单元测试时更加便捷。
在软件开发中,依赖注入有助于降低组件之间的耦合度,提高代码的灵活性、可维护性和可测试性。通过依赖注入,可以更方便地管理组件之间的依赖关系,提高代码的可读性和可维护性。
配置文件、日志处理下篇见,如果觉得有帮助请务必继续学下去
创作不易,喜欢的请一键三连,转载请注明出处,侵权必究