Skip to content

Spine不隱藏請求流程的框架

Spine 透過明確執行管道公開如何解釋請求、執行順序、何時調用業務邏輯以及如何在回應中完成請求。控制器僅表達用例,運行時負責所有有關執行的決策。

IoC容器·執行管道·攔截器鏈
沒有魔法的執行結構

主要特點

1.熟悉的結構

如果您是 Spring、NestJS 開發人員,請立即開始。控制器→服務→儲存庫層次結構、建構函式註入和攔截器鏈。它藉用了熟悉的企業架構,但使用 Spine 的明確管道來執行。

go
func NewUserService(repo *UserRepository) *UserService {
    return &UserService{repo: repo}
}

func NewUserController(svc *UserService) *UserController {
    return &UserController{svc: svc}
}

2. 快速啟動

無需 JVM 預熱。也沒有 Node.js 運行時初始化。立即請求已編譯的 Go 二進位。

zsh — 80x24
➜ spine-app go run .

3. 更少的程式碼

只使用類型系統來表達依賴關係,而不需要 @Injectable@Controller@Autowired

代替註釋或約定, 簽名本身揭示了結構和合約。

4.攔截器管道

可以在請求之前/之後/完成時插入邏輯。 橫切關注點,例如身分驗證、交易和日誌記錄 將其與業務程式碼分離,放入執行流程中。

執行順序由 Sp​​ine 的管道明確控制。

go
goapp.Interceptor(
    &TxInterceptor{},
    &AuthInterceptor{},
    &LoggingInterceptor{},
)

執行僅透過一個管道

在Spine中,請求無一例外地透過一個執行管道。

Router 只負責選擇執行目標; 只有 Pipeline 知道執行順序與流程。

你所看到的就是一切

無註釋,無模組定義

main.go

go
// 主機程式
func main() {
    app := spine.New()

    // ✅ 只需註冊建構函數即可自動解決依賴關係
    // ✅ 可以任意順序註冊
    app.Constructor(NewUserRepository, NewUserService, NewUserController)

    routes.RegisterUserRoutes(app)
    app.Run(boot.Options{
		Address:                ":8080",
		EnableGracefulShutdown: true,
		ShutdownTimeout:        10 * time.Second,
		HTTP: &boot.HTTPOptions{},
	})
}

路線.go

go
// 路線.go
func RegisterUserRoutes(app spine.App) {
    // ✅ 路由和處理程式的連接是明確的
    // ✅ 一目了然知道哪個方法是哪個路徑
    app.Route("GET", "/users", (*UserController).GetUser)
    app.Route("POST", "/users", (*UserController).CreateUser)
}

控制器.go

go
// 控制器.go
// ✅ 無註解——純 Go 結構
// ✅ 測試時易於模擬
type UserController struct {
    svc *UserService
}

// ✅ 建構子參數 = 依賴聲明
// ✅ 沒有隱藏的魔法
func NewUserController(svc *UserService) *UserController {
    return &UserController{svc: svc}
}

// ✅ 函數簽章是 API 規範
// ✅ 輸入(query.Values)和輸出(UserResponse、error)清晰
func (c *UserController) GetUser(ctx context.Context, q query.Values) (UserResponse, error) {
    return c.svc.Get(ctx, q.Int("id", 0))
}

service.go

go
// 服務.go
// ✅ 無註釋
type UserService struct {
    repo *UserRepository
}

func NewUserService(repo *UserRepository) *UserService {
    return &UserService{repo: repo}
}

儲存庫.go

go
// 儲存庫.go
// ✅ 無註釋
type UserRepository struct {
    db *bun.DB
}

func NewUserRepository(db *bun.DB) *UserRepository {
    return &UserRepository{db: db}
}

「不隱藏請求程式的框架」