Maison >développement back-end >Golang >Comment puis-je améliorer l'injection de dépendances pour aller au-delà de l'instanciation de base ?

Comment puis-je améliorer l'injection de dépendances pour aller au-delà de l'instanciation de base ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-21 09:48:13202parcourir

How Can I Improve Dependency Injection in Go Beyond Basic Instantiation?

Modèles d'injection de dépendances améliorés dans Go

Dans Go, l'approche traditionnelle du câblage des composants consiste à instancier et à transmettre manuellement les dépendances dans la fonction principale , comme on le voit dans le code donné. Bien que cette méthode soit fonctionnelle, elle peut devenir lourde et sujette aux erreurs à mesure que la base de code se développe.

Pour résoudre ce problème, il convient d'envisager des modèles alternatifs :

1. Paramètres de fonction

Transmettez les dépendances en tant que paramètres de fonction. Cela simplifie les tests en permettant de simuler facilement les dépendances.

func someConsumer(g Guy) {
  fmt.Println("Hello, " + g.SomeDumbGuy())
}

func main() {
    var d datstr
    someConsumer(d)
}

2. Fonctions d'usine

Créez des fonctions d'usine qui renvoient des objets avec des dépendances déjà injectées. Cela centralise l'injection de dépendances et facilite la configuration des dépendances en fonction d'un contexte spécifique.

func NewGuy() Guy {
  return &datstr{}
}

func someConsumer(g Guy) {
  fmt.Println("Hello, " + g.SomeDumbGuy())
}

func main() {
    g := NewGuy()
    someConsumer(g)
}

3. Middleware

Utilisez des fonctions middleware pour intercepter les requêtes et injecter des dépendances dans le contexte de la requête. Cela offre de la flexibilité et permet une injection dynamique de dépendances.

func wrapWithGuy(handler http.Handler) http.Handler {
  return func(w http.ResponseWriter, r *http.Request) {
    g := NewGuy()
    r.Context() = context.WithValue(r.Context(), "guy", g)
    handler.ServeHTTP(w, r)
  }
}

func main() {
  handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    g := r.Context().Value("guy").(Guy)
    fmt.Fprintf(w, "Hello, %s!", g.SomeDumbGuy())
  })
  http.Handle("/", wrapWithGuy(handler))
  http.ListenAndServe(":8080", nil)
}

Évitez les bibliothèques DI

Contrairement à d'autres langages, Go ne nécessite pas l'utilisation d'une injection de dépendances (DI ) bibliothèque. En fait, les bibliothèques DI peuvent introduire une complexité et une abstraction inutiles. La simplicité de Go et la gestion explicite des dépendances favorisent la transparence et la facilité de débogage.

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