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
Libérer: 2024-12-21 09:48:13
original
244 Les gens l'ont consulté

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)
}
Copier après la connexion

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)
}
Copier après la connexion

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)
}
Copier après la connexion

É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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal