Maison >développement back-end >Golang >Aller à l'introduction et à l'application de l'injection de dépendance linguistique

Aller à l'introduction et à l'application de l'injection de dépendance linguistique

WBOY
WBOYoriginal
2024-04-07 13:45:02657parcourir

L'injection de dépendances est un modèle de conception utilisé pour injecter des objets et leurs dépendances afin d'améliorer la testabilité et la flexibilité du code. Dans Go, l'injection de dépendances peut être effectuée via : Injection de constructeur : transmettre des dépendances lors de l'appel du constructeur. Injection de setter : définissez des méthodes de définition pour définir les dépendances. Conteneurs : créez et gérez des conteneurs de dépendances à l'aide de bibliothèques tierces ou de fonctions intégrées.

go语言 依赖注入简介与应用

Introduction et application de l'injection de dépendances du langage Go

Injection de dépendances

L'injection de dépendances est un modèle de conception logicielle utilisé pour injecter des objets et leurs dépendances. C'est le contraire de la spécification de dépendances lors de la création d'une classe ou d'une méthode, ce qui permet la testabilité et la flexibilité du code.

Injection de dépendances dans Go

En Go, l'injection de dépendances peut être réalisée grâce aux outils suivants :

  • Injection de constructeur : Passer les dépendances directement lors de l'appel du constructeur.
  • injection setter : Définissez une méthode setter pour définir les dépendances.
  • Conteneurs : Créez et gérez des conteneurs de dépendances à l'aide de bibliothèques tierces (telles que Wire) ou de fonctions intégrées (Builder).

Cas pratique : logging

Supposons que nous ayons une interface nommée logger, qui a une méthode Log : logger 的接口,它有一个 Log 方法:

type logger interface {
    Log(msg string)
}

我们有一个 fileLogger 结构体实现了 logger 接口,它将日志信息写入文件:

type fileLogger struct {
    path string
}

func (f fileLogger) Log(msg string) {
    // 将日志信息写入文件
}

现在,我们创建一个函数来处理用户的请求:

func handleRequest(l logger) {
    // 使用 l 记录处理过程中的日志
}

使用构造函数注入

我们可以直接在调用 handleRequest 函数时传递 fileLogger

func main() {
    // 创建一个 fileLogger
    logger := fileLogger{"log.txt"}

    // 使用 fileLogger 处理请求
    handleRequest(logger)
}

使用 setter 注入

我们也可以使用 setter 注入:

func handleRequest(l logger) {
    // 如果 l 不为 nil,则使用 l 记录日志
    if l != nil {
        l.Log("处理请求")
    }
}

func main() {
    // 创建一个 fileLogger
    logger := fileLogger{"log.txt"}

    // 使用 fileLogger 处理请求
    handleRequest(logger)

    // 处理另一个请求时不记录日志
    handleRequest(nil)
}

使用容器

使用容器可以更轻松地管理依赖项,例如 Wire:

func Initialize(logger fileLogger) (*Service, error) {
    // 初始化一个 Service,依赖于 fileLogger
    return &Service{}, nil
}

然后在 main

func main() {
    // 创建一个 Wire 容器
    container, err := wire.Build(Initialize)
    if err != nil {
        log.Fatal(err)
    }

    // 从容器中获取 Service
    service, err := container.Get(new(*Service))
    if err != nil {
        log.Fatal(err)
    }
}

Nous avons un fileLogger La structure implémente l'interface logger, qui écrit les informations du journal dans un fichier : 🎜rrreee🎜Maintenant, nous créons une fonction pour gérer la demande de l'utilisateur : 🎜rrreee🎜🎜Utilisez le constructeur Injection🎜🎜 🎜Nous pouvons passer directement fileLogger lors de l'appel de la fonction handleRequest : 🎜rrreee🎜🎜Utiliser l'injection setter🎜🎜🎜Nous pouvons également utiliser l'injection setter : 🎜rrreee🎜🎜 Utiliser des conteneurs🎜 🎜🎜L'utilisation de conteneurs permet de gérer plus facilement les dépendances, par exemple Wire : 🎜rrreee🎜 Puis dans la fonction main : 🎜rrreee

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