Go-Spring 入門篇(五)

李輕水發表於2021-12-04

序言

示例程式碼 github.com/acrossmountain/gs-demo

上章 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":"上傳檔案成功"}

這樣我們就成功完成了 controlerservice 解耦。

Go-Spring 官網
Github

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章