序言
上章 Go-Spring 入門篇(四)的程式碼已經很完整了,但是 controller
直接匯入 service
造成對邏輯的直接依賴,這樣會造成很高的耦合。
本章我們使用 interface
來做到解除依賴,這樣不僅解決的匯入的問題也能夠快速的替換 serivce
的實現。
types/services.go
將上傳的服務抽象稱為介面。
package types
import "io"
type FileProvider interface {
PutObject(name string, r io.Reader, size int64) (string, error)
ExistsObject(name string) bool
}
controllers/upload/upload.go
然後把 *filesystem.Service
型別替換為 types.FileProvider
即可,spring-boot 會自動匹配介面對應的例項。
type Controller struct {
FileService types.FileProvider `autowire:""`
}
services/file/file.go
package services
import (
// ...
"learn/types"
)
func init() {
// 需要手動宣告支援的介面物件
gs.Object(new(filesystem.Service)).
Export((*types.FileProvider)(nil))
}
重新執行 go run main.go
並測試,功能正常。
$ curl -F "file=@./1.jpg" http://127.0.0.1:8080/upload
$ {"code":0,"data":{"url":"temp/1.jpg"},"msg":"上傳檔案成功"}
這樣我們就成功完成了 controler
對 service
解耦。
本作品採用《CC 協議》,轉載必須註明作者和本文連結