补充ioc

This commit is contained in:
yumaojun03 2024-12-15 12:10:11 +08:00
parent c3a407ba0b
commit 60320a9861
11 changed files with 81 additions and 31 deletions

View File

@ -368,3 +368,16 @@ func GetService() Service {
return ioc.Controller().Get(AppName).(Service)
}
```
启动的时候 只需要启动 HTTP Sever就可以啦
```go
func main() {
config.LoadConfig()
// 服务器启动
if err := server.GinServer.Run(http.Get().Addr()); err != nil {
log.Println(err)
}
}
```

View File

@ -3,30 +3,44 @@ package api
import (
"github.com/gin-gonic/gin"
"github.com/infraboard/mcube/v2/http/gin/response"
"github.com/infraboard/mcube/v2/ioc"
"gitlab.com/go-course-project/go17/vblog/apps/blog"
"gitlab.com/go-course-project/go17/vblog/middleware"
"gitlab.com/go-course-project/go17/vblog/server"
)
// 上传怎么用:
// main.go 组装的时候,传入具体实现, 实现了业务的 插件化
// 访问我们mock测试, 有助于构造 小规模的单元环境
func NewBlogApiHandler(blogImpl blog.Service) *BlogApiHandler {
return &BlogApiHandler{
blog: blogImpl,
}
// func NewBlogApiHandler(blogImpl blog.Service) *BlogApiHandler {
// return &BlogApiHandler{
// blog: blogImpl,
// }
// }
func init() {
ioc.Api().Registry(&BlogApiHandler{})
}
type BlogApiHandler struct {
ioc.ObjectImpl
blog blog.Service
}
func (i *BlogApiHandler) Init() error {
i.blog = blog.GetService()
i.Registry(server.GinServer)
return nil
}
// 提供注册功能, 提供一个Group
// book := server.Group("/api/tokens")
func (h *BlogApiHandler) Registry(r *gin.Engine) {
router := r.Group("/vblog/api/v1/blogs")
router.GET("", h.QueryBlog)
router.Use(middleware.Auth)
router.POST("", h.CreateBlog)
router.GET("", h.QueryBlog)
}
// BODY

View File

@ -4,16 +4,24 @@ import (
"context"
"fmt"
"github.com/infraboard/mcube/v2/ioc"
"github.com/infraboard/mcube/v2/ioc/config/datasource"
"gitlab.com/go-course-project/go17/vblog/apps/blog"
"gitlab.com/go-course-project/go17/vblog/middleware"
)
var BlogService blog.Service = &BlogServiceImpl{}
func init() {
ioc.Controller().Registry(&BlogServiceImpl{})
}
// 定义一个struct, 用于实现 UserService就是刚才定义的接口
// 怎么才能判断这个结构体没有实现这个接口
type BlogServiceImpl struct {
ioc.ObjectImpl
}
func (i *BlogServiceImpl) Name() string {
return blog.AppName
}
// CreateBlog implements blog.Service.

View File

@ -5,7 +5,6 @@ import (
"testing"
"gitlab.com/go-course-project/go17/vblog/apps/blog"
"gitlab.com/go-course-project/go17/vblog/apps/blog/impl"
)
var (
@ -23,7 +22,7 @@ func TestCreateBlog(t *testing.T) {
"Language": "Golang",
},
}
ins, err := impl.BlogService.CreateBlog(ctx, req)
ins, err := blog.GetService().CreateBlog(ctx, req)
if err != nil {
t.Fatal(err)
}
@ -36,7 +35,7 @@ func TestQueryBlog(t *testing.T) {
req.Tags = map[string]string{
"Language": "Golang",
}
ins, err := impl.BlogService.QueryBlog(ctx, req)
ins, err := blog.GetService().QueryBlog(ctx, req)
if err != nil {
t.Fatal(err)
}

View File

@ -4,9 +4,18 @@ import (
"context"
"strings"
"github.com/infraboard/mcube/v2/ioc"
"gitlab.com/go-course-project/go17/vblog/utils"
)
const (
AppName = "blog"
)
func GetService() Service {
return ioc.Controller().Get(AppName).(Service)
}
type Service interface {
// 创建博客
CreateBlog(context.Context, *CreateBlogRequest) (*Blog, error)

View File

@ -1,7 +1,9 @@
package apps
import (
_ "gitlab.com/go-course-project/go17/vblog/apps/blog/api"
_ "gitlab.com/go-course-project/go17/vblog/apps/blog/impl"
_ "gitlab.com/go-course-project/go17/vblog/apps/token/api"
_ "gitlab.com/go-course-project/go17/vblog/apps/token/impl"
_ "gitlab.com/go-course-project/go17/vblog/apps/user/impl"
)

View File

@ -3,20 +3,27 @@ package api
import (
"github.com/gin-gonic/gin"
"github.com/infraboard/mcube/v2/http/gin/response"
"github.com/infraboard/mcube/v2/ioc"
"gitlab.com/go-course-project/go17/vblog/apps/token"
"gitlab.com/go-course-project/go17/vblog/server"
)
func NewTokenApiHandler(tokenImpl token.UserService) *TokenApiHandler {
return &TokenApiHandler{
token: tokenImpl,
}
func init() {
ioc.Api().Registry(&TokenApiHandler{})
}
type TokenApiHandler struct {
ioc.ObjectImpl
// 业务控制器
token token.UserService
}
func (i *TokenApiHandler) Init() error {
i.token = token.GetService()
i.Registry(server.GinServer)
return nil
}
// 提供注册功能, 提供一个Group
// book := server.Group("/api/tokens")
func (h *TokenApiHandler) Registry(r *gin.Engine) {

View File

@ -56,6 +56,10 @@ func (t *TokenServiceImpl) IssueToken(ctx context.Context, in *token.IssueTokenR
// 3. 颁发Token
tk := token.NewToken(fmt.Sprintf("%d", u.Id)).SetRefUserName(u.Username)
// if in.RememberMe {
// tk.AccessTokenExpireAt
// }
if err := datasource.DBFromCtx(ctx).Create(tk).Error; err != nil {
return nil, err
}

View File

@ -1,6 +1,6 @@
<mxfile host="65bd71144e">
<diagram id="QJ9SYQZkHZ_Pkl1wdixx" name="第 1 页">
<mxGraphModel dx="947" dy="479" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<mxGraphModel dx="947" dy="354" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
@ -57,7 +57,7 @@
<mxCell id="27" value="Text" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="400" y="400" width="60" height="30" as="geometry"/>
</mxCell>
<mxCell id="29" value="&lt;h1&gt;对象生命周期&lt;/h1&gt;&lt;p&gt;1. 对象注册&lt;/p&gt;&lt;p&gt;2. 对象配置(通过配置文件读取)&lt;/p&gt;&lt;p&gt;3. 初始化(基础属性, 依然依赖)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;" style="text;html=1;strokeColor=none;fillColor=none;spacing=5;spacingTop=-20;whiteSpace=wrap;overflow=hidden;rounded=0;" vertex="1" parent="1">
<mxCell id="29" value="&lt;h1&gt;对象生命周期&lt;/h1&gt;&lt;p&gt;1. 对象注册&lt;/p&gt;&lt;p&gt;2. 对象配置(通过配置文件读取)&lt;/p&gt;&lt;p&gt;3. 初始化(基础属性, 依然依赖)&lt;/p&gt;&lt;p&gt;程序运行中 。。。。。。&lt;/p&gt;&lt;p&gt;4. 对象的销毁(销毁依赖资源,比如数据库连接,&amp;nbsp; conn)&lt;/p&gt;&lt;p&gt;程序退出 。。。&lt;/p&gt;" style="text;html=1;strokeColor=none;fillColor=none;spacing=5;spacingTop=-20;whiteSpace=wrap;overflow=hidden;rounded=0;" vertex="1" parent="1">
<mxGeometry x="30" y="500" width="200" height="230" as="geometry"/>
</mxCell>
</root>

View File

@ -3,30 +3,16 @@ package main
import (
"log"
blogApi "gitlab.com/go-course-project/go17/vblog/apps/blog/api"
blogImpl "gitlab.com/go-course-project/go17/vblog/apps/blog/impl"
"gitlab.com/go-course-project/go17/vblog/apps/token"
tokenApi "gitlab.com/go-course-project/go17/vblog/apps/token/api"
"github.com/gin-gonic/gin"
"github.com/infraboard/mcube/v2/ioc/config/http"
"gitlab.com/go-course-project/go17/vblog/config"
"gitlab.com/go-course-project/go17/vblog/server"
)
func main() {
config.LoadConfig()
// gin Engine, 它包装了http server
server := gin.Default()
// 注册业务模块的路有
tokenApi.NewTokenApiHandler(token.GetService()).Registry(server)
blogApi.NewBlogApiHandler(&blogImpl.BlogServiceImpl{}).Registry(server)
// ... 50 个API
//
// 服务器启动
if err := server.Run(http.Get().Addr()); err != nil {
if err := server.GinServer.Run(http.Get().Addr()); err != nil {
log.Println(err)
}
}

8
vblog/server/server.go Normal file
View File

@ -0,0 +1,8 @@
package server
import "github.com/gin-gonic/gin"
var (
// gin Engine, 它包装了http server
GinServer = gin.Default()
)