ホームページ >バックエンド開発 >Golang >Go の Jin Router ハンドラーに依存関係を注入するにはどうすればよいですか?

Go の Jin Router ハンドラーに依存関係を注入するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-11 07:59:10211ブラウズ

How Can I Inject Dependencies into Gin Router Handlers in Go?

依存関係の注入を使用して、Gin ルーター ハンドラーに引数を渡す

Golang では、Web アプリケーションの依存関係を管理するための一般的な方法は、依存関係の注入を使用することです。 。この手法を使用すると、グローバル変数を使用したり、関数シグネチャを直接変更したりせずに、ハンドラーに引数を渡すことができます。

クロージャーの使用

1 つの方法は、クロージャーを使用してハンドラーをラップすることです。必要な依存関係を持つ関数。クロージャーは依存関係をカプセル化し、呼び出し時に依存関係をハンドラーに渡せるようにします。

// SomeHandler encapsulates the DB connection and returns a handler function
func SomeHandler(db *sql.DB) gin.HandlerFunc {
    return func(c *gin.Context) {
        // Use the db connection within the handler
        rows, err := db.Query(...)
        if err != nil {
            c.JSON(http.StatusInternalServerError, err)
            return
        }
        c.JSON(http.StatusOK, rows)
    }
}

func main() {
    db, err := sql.Open(...)
    router := gin.Default()
    router.GET("/test", SomeHandler(db))
}

ミドルウェアの使用

ミドルウェアは、ハンドラーに引数を渡すためのもう 1 つのオプションです。ミドルウェア関数は実際のハンドラーの前に実行され、リクエスト コンテキストを変更したり、依存関係を挿入したりできます。

// DBMiddleware injects the DB connection into the context
func DBMiddleware(db *sql.DB) gin.HandlerFunc {
    return func(c *gin.Context) {
        c.Set("db", db)
        c.Next()
    }
}

func SomeHandler(c *gin.Context) {
    // Retrieve the DB connection from the context
    db := c.MustGet("db").(*sql.DB)
    // Use the db connection within the handler
}

func main() {
    db, err := sql.Open(...)
    router := gin.Default()
    router.Use(DBMiddleware(db))
    router.GET("/test", SomeHandler)
}

依存関係注入テクニックを利用することで、グローバル変数の汚染を回避し、Gin に引数を効果的に渡しながらクリーンなコード分離を維持できます。ルーターハンドラー

以上がGo の Jin Router ハンドラーに依存関係を注入するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。