Spine不隱藏請求流程的框架
Spine 透過明確執行管道公開如何解釋請求、執行順序、何時調用業務邏輯以及如何在回應中完成請求。控制器僅表達用例,運行時負責所有有關執行的決策。
IoC容器·執行管道·攔截器鏈
沒有魔法的執行結構
如果您是 Spring、NestJS 開發人員,請立即開始。控制器→服務→儲存庫層次結構、建構函式註入和攔截器鏈。它藉用了熟悉的企業架構,但使用 Spine 的明確管道來執行。
func NewUserService(repo *UserRepository) *UserService {
return &UserService{repo: repo}
}
func NewUserController(svc *UserService) *UserController {
return &UserController{svc: svc}
}無需 JVM 預熱。也沒有 Node.js 運行時初始化。立即請求已編譯的 Go 二進位。
只使用類型系統來表達依賴關係,而不需要 @Injectable、@Controller 和 @Autowired。
代替註釋或約定, 簽名本身揭示了結構和合約。
可以在請求之前/之後/完成時插入邏輯。 橫切關注點,例如身分驗證、交易和日誌記錄 將其與業務程式碼分離,放入執行流程中。
執行順序由 Spine 的管道明確控制。
goapp.Interceptor(
&TxInterceptor{},
&AuthInterceptor{},
&LoggingInterceptor{},
)在Spine中,請求無一例外地透過一個執行管道。
Router 只負責選擇執行目標; 只有 Pipeline 知道執行順序與流程。
無註釋,無模組定義
// 主機程式
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
func RegisterUserRoutes(app spine.App) {
// ✅ 路由和處理程式的連接是明確的
// ✅ 一目了然知道哪個方法是哪個路徑
app.Route("GET", "/users", (*UserController).GetUser)
app.Route("POST", "/users", (*UserController).CreateUser)
}// 控制器.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))
}// 服務.go
// ✅ 無註釋
type UserService struct {
repo *UserRepository
}
func NewUserService(repo *UserRepository) *UserService {
return &UserService{repo: repo}
}// 儲存庫.go
// ✅ 無註釋
type UserRepository struct {
db *bun.DB
}
func NewUserRepository(db *bun.DB) *UserRepository {
return &UserRepository{db: db}
}