diff --git a/book/v3/controllers/book.go b/book/v3/controllers/book.go index 45a0f79..0c46dd6 100644 --- a/book/v3/controllers/book.go +++ b/book/v3/controllers/book.go @@ -6,12 +6,20 @@ import ( "122.51.31.227/go-course/go18/book/v3/config" "122.51.31.227/go-course/go18/book/v3/exception" "122.51.31.227/go-course/go18/book/v3/models" + "122.51.31.227/go-course/go18/skills/ioc" "gorm.io/gorm" ) -var Book = &BookController{} +func GetBookService() *BookController { + return ioc.Controller.Get("book_controller").(*BookController) +} + +func init() { + ioc.Controller.Registry("book_controller", &BookController{}) +} type BookController struct { + ioc.ObjectImpl } func NewGetBookRequest(bookNumber int) *GetBookRequest { diff --git a/book/v3/controllers/book_test.go b/book/v3/controllers/book_test.go index 4a5fcac..48f4987 100644 --- a/book/v3/controllers/book_test.go +++ b/book/v3/controllers/book_test.go @@ -12,7 +12,7 @@ import ( ) func TestGetBook(t *testing.T) { - book, err := controllers.Book.GetBook(context.Background(), controllers.NewGetBookRequest(3)) + book, err := controllers.GetBookService().GetBook(context.Background(), controllers.NewGetBookRequest(3)) if err != nil { t.Fatal(err) } @@ -20,7 +20,7 @@ func TestGetBook(t *testing.T) { } func TestCreateBook(t *testing.T) { - book, err := controllers.Book.CreateBook(context.Background(), &models.BookSpec{ + book, err := controllers.GetBookService().CreateBook(context.Background(), &models.BookSpec{ Title: "unit test for go controller obj", Author: "will", Price: 99.99, diff --git a/book/v3/controllers/comment.go b/book/v3/controllers/comment.go index 0406170..1a59a6f 100644 --- a/book/v3/controllers/comment.go +++ b/book/v3/controllers/comment.go @@ -19,7 +19,7 @@ type AddCommentRequest struct { func (c *CommentController) AddComment(ctx context.Context, in *AddCommentRequest) (*models.Comment, error) { // 业务处理的细节 // 多个业务模块 进行交互 - book, err := Book.GetBook(ctx, NewGetBookRequest(in.BookNumber)) + book, err := GetBookService().GetBook(ctx, NewGetBookRequest(in.BookNumber)) // if exception.IsApiException(err, exception.CODE_NOT_FOUND) { diff --git a/book/v3/handlers/book.go b/book/v3/handlers/book.go index 5fa786a..eba05db 100644 --- a/book/v3/handlers/book.go +++ b/book/v3/handlers/book.go @@ -114,7 +114,7 @@ func (h *BookApiHandler) createBook(ctx *gin.Context) { return } - book, err := controllers.Book.CreateBook(ctx.Request.Context(), bookSpecInstance) + book, err := controllers.GetBookService().CreateBook(ctx.Request.Context(), bookSpecInstance) if err != nil { response.Failed(ctx, err) return @@ -131,7 +131,7 @@ func (h *BookApiHandler) getBook(ctx *gin.Context) { return } - book, err := controllers.Book.GetBook(ctx, controllers.NewGetBookRequest(int(bnInt))) + book, err := controllers.GetBookService().GetBook(ctx, controllers.NewGetBookRequest(int(bnInt))) if err != nil { response.Failed(ctx, err) return diff --git a/skills/ioc/README.md b/skills/ioc/README.md new file mode 100644 index 0000000..ccc319f --- /dev/null +++ b/skills/ioc/README.md @@ -0,0 +1,5 @@ +# ioc + +![alt text](image.png) + +# 没有Ioc \ No newline at end of file diff --git a/skills/ioc/image.png b/skills/ioc/image.png new file mode 100644 index 0000000..2a78271 Binary files /dev/null and b/skills/ioc/image.png differ diff --git a/skills/ioc/interface.go b/skills/ioc/interface.go new file mode 100644 index 0000000..27f0ea6 --- /dev/null +++ b/skills/ioc/interface.go @@ -0,0 +1,35 @@ +package ioc + +var containers = []Contaienr{ + Api, + Controller, + Config, + Default, +} + +func Init() { + for _, c := range containers { + if err := c.Init(); err != nil { + panic(err) + } + } +} + +// ioc 容器功能定义 +type Contaienr interface { + Registry(name string, obj Object) + Get(name string) Object + // 初始化所有已经注册的对象 + Init() error +} + +// 注册对象的约束 +type Object interface { + Init() error +} + +type ObjectImpl struct{} + +func (o *ObjectImpl) Init() error { + return nil +} diff --git a/skills/ioc/map.go b/skills/ioc/map.go new file mode 100644 index 0000000..8c4f483 --- /dev/null +++ b/skills/ioc/map.go @@ -0,0 +1,38 @@ +package ioc + +var Api = NewMapContainer("api") +var Controller = NewMapContainer("controller") +var Config = NewMapContainer("config") +var Default = NewMapContainer("default") + +func NewMapContainer(name string) Contaienr { + return &MapContainer{ + name: name, + storage: map[string]Object{}, + } +} + +// ioc 容器 +type MapContainer struct { + name string + storage map[string]Object +} + +func (m *MapContainer) Registry(name string, obj Object) { + m.storage[name] = obj +} + +func (m *MapContainer) Get(name string) Object { + return m.storage[name] +} + +// 初始化所有已经注册的对象 +func (m *MapContainer) Init() error { + for _, v := range m.storage { + if err := v.Init(); err != nil { + return err + } + } + + return nil +}