Maison >développement back-end >Golang >Comment puis-je injecter des dépendances dans les gestionnaires de routeur Gin dans Go ?

Comment puis-je injecter des dépendances dans les gestionnaires de routeur Gin dans Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-11 07:59:10216parcourir

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

Utilisation de l'injection de dépendances pour transmettre des arguments aux gestionnaires de routeurs Gin

Dans Golang, une pratique courante pour gérer les dépendances dans les applications Web consiste à utiliser l'injection de dépendances . Cette technique vous permet de transmettre des arguments aux gestionnaires sans utiliser de variables globales ni modifier directement la signature de la fonction.

Utiliser des fermetures

Une approche consiste à utiliser des fermetures pour envelopper votre gestionnaire fonctionner avec les dépendances souhaitées. Une fermeture encapsule les dépendances, leur permettant d'être transmises au gestionnaire lorsqu'elles sont invoquées.

// 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))
}

Utilisation du middleware

Le middleware est une autre option pour transmettre des arguments aux gestionnaires. Les fonctions middleware sont exécutées avant le gestionnaire réel et peuvent modifier le contexte de la requête ou injecter des dépendances.

// 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)
}

En utilisant des techniques d'injection de dépendances, vous pouvez éviter de polluer les variables globales et maintenir une séparation propre du code tout en transmettant efficacement les arguments à Gin. gestionnaires de routeurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn