Pengenalan suntikan ketergantungan bahasa Go dan aplikasi

WBOY
Lepaskan: 2024-04-07 13:45:02
asal
628 orang telah melayarinya

Suntikan kebergantungan ialah corak reka bentuk yang digunakan untuk menyuntik objek dan kebergantungannya untuk meningkatkan kebolehujian dan fleksibiliti kod. Dalam Go, suntikan kebergantungan boleh dilakukan melalui: Suntikan pembina: Melepasi kebergantungan apabila memanggil pembina. Suntikan penetap: Tentukan kaedah penetap untuk menetapkan kebergantungan. Bekas: Buat dan urus bekas pergantungan menggunakan perpustakaan pihak ketiga atau fungsi terbina dalam.

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

Pengenalan dan aplikasi suntikan ketergantungan bahasa Go

Suntikan ketergantungan

Suntikan ketergantungan ialah corak reka bentuk perisian yang digunakan untuk menyuntik objek dan kebergantungan mereka. Ia adalah bertentangan dengan menentukan kebergantungan apabila mencipta kelas atau kaedah, membenarkan kebolehujian dan fleksibiliti kod.

Suntikan Kebergantungan dalam Go

Dalam Go, suntikan kebergantungan boleh dicapai melalui alatan berikut:

  • Suntikan Pembina: Melepasi kebergantungan terus apabila memanggil pembina.
  • suntikan penetap: Tentukan kaedah penetap untuk menetapkan kebergantungan.
  • Bekas: Cipta dan urus bekas pergantungan menggunakan perpustakaan pihak ketiga (seperti Wire) atau fungsi terbina dalam (Pembina).

Kes praktikal: logging

Andaikan kita mempunyai antara muka bernama logger, yang mempunyai kaedah Log: logger 的接口,它有一个 Log 方法:

type logger interface {
    Log(msg string)
}
Salin selepas log masuk

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

type fileLogger struct {
    path string
}

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

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

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

使用构造函数注入

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

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

    // 使用 fileLogger 处理请求
    handleRequest(logger)
}
Salin selepas log masuk

使用 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)
}
Salin selepas log masuk

使用容器

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

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

然后在 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)
    }
}
Salin selepas log masuk
Kami mempunyai fileLogger struktur melaksanakan antara muka logger, yang menulis maklumat log pada fail: 🎜rrreee🎜Kini, kami mencipta fungsi untuk mengendalikan permintaan pengguna: 🎜rrreee🎜🎜Gunakan Injeksi pembina🎜🎜 🎜Kami boleh terus menghantar fileLogger apabila memanggil fungsi handleRequest: 🎜rrreee🎜🎜Gunakan suntikan setter🎜🎜🎜Kami juga boleh menggunakan suntikan setter: 🎜rrreee🎜🎜 Menggunakan bekas🎜 🎜🎜Menggunakan bekas memudahkan untuk mengurus kebergantungan, contohnya Wire: 🎜rrreee🎜 Kemudian dalam fungsi utama: 🎜rrreee

Atas ialah kandungan terperinci Pengenalan suntikan ketergantungan bahasa Go dan aplikasi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!