Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Amalan terbaik suntikan pergantungan bahasa Go

Amalan terbaik suntikan pergantungan bahasa Go

WBOY
WBOYasal
2024-04-07 15:42:021168semak imbas

Amalan terbaik untuk melaksanakan suntikan kebergantungan dalam Go termasuk: Gandingan longgar: Gandingkan objek secara longgar dengan kebergantungannya untuk meningkatkan kebolehujian dan kebolehselenggaraan. Kebolehujian: Tingkatkan kredibiliti ujian dengan mengejek kebergantungan untuk ujian unit. Kebolehskalaan: Meningkatkan kebolehskalaan kod anda dengan menukar atau menambah kebergantungan dengan mudah. Laksanakan DI menggunakan perpustakaan pihak ketiga seperti wayar, tentukan antara muka dan cipta kebergantungan menggunakan wayar.NewSet.

Amalan terbaik suntikan pergantungan bahasa Go

Amalan Terbaik Suntikan Ketergantungan dalam Bahasa Go

Suntikan Ketergantungan (DI) ialah corak reka bentuk perisian yang membolehkan kebergantungan disuntik ke dalam objek semasa masa jalan. Dalam bahasa Go, DI membantu meningkatkan kebolehujian, kebolehskalaan dan kebolehselenggaraan kod.

Faedah DI

  • Gandingan longgar: Dengan DI, objek digandingkan secara longgar dengan kebergantungannya, yang menjadikan ujian dan pemfaktoran semula lebih mudah.
  • Kestabilan: DI membenarkan ujian unit objek menggunakan kebergantungan palsu, sekali gus meningkatkan kredibiliti ujian.
  • Skalabiliti: DI memudahkan untuk menukar kebergantungan atau menambah yang baharu, dengan itu meningkatkan kebolehskalaan kod anda.

Melaksanakan DI dalam bahasa Go

Bahasa Go mempunyai sokongan terbina dalam yang sangat terhad untuk DI. Oleh itu, selalunya perlu menggunakan perpustakaan pihak ketiga untuk melaksanakan DI. Pustaka yang popular ialah [wire](https://github.com/google/wire).

Untuk menggunakan wayar, anda perlu terlebih dahulu menentukan antara muka yang mengandungi semua kebergantungan:

type MyServiceDeps struct {
    Repository Repository
    Logger     Logger
}

Kemudian, anda boleh menggunakan fungsi wire.NewSet untuk mencipta struktur yang diperlukan: wire.NewSet 函数创建所需的结构:

func NewMyService(deps MyServiceDeps) MyService {
    return MyService{
        repository: deps.Repository,
        logger:     deps.Logger,
    }
}

最后,使用 InitInjector 函数生成依赖项注入器:

func main() {
    wire.Build(
        NewMyService,
        NewRepository,
        NewLogger,
    )
}

实战案例

考虑一个シンプルな Web 应用程序,它需要与数据库和 HTTP 服务器交互。我们可以使用 DI 来创建松散耦合的服务,这些服务可以独立于特定依赖项进行测试:

// 定义依赖项接口
type UserRepo interface {
    GetUser(id int) (*User, error)
}

type HTTPServer interface {
    Start() error
}

// 定义服务结构
type UserService struct {
    repo UserRepo
}

// 实现用户服务方法
func (s *UserService) GetUser(id int) (*User, error) {
    return s.repo.GetUser(id)
}

// 定义 DI 函数
func NewUserService(r UserRepo) *UserService {
    return &UserService{
        repo: r,
    }
}

// 初始化 DI 注入器,并启动 HTTP 服务器
func main() {
    injector, err := wire.Build(
        NewUserService,
        NewUserRepository,
        NewHTTPServer,
    )
    if err != nil {
        panic(err)
    }

    server := injector.Get(NewHTTPServer)
    server.Start()
}

在这个示例中,DI 使我们能够在不修改 UserServicerrreee

Akhir sekali, gunakan Fungsi InitInjector menjana penyuntik kebergantungan: 🎜rrreee🎜🎜Kes praktikal 🎜🎜🎜Pertimbangkan シンプルなaplikasi Web yang perlu berinteraksi dengan pangkalan data dan pelayan HTTP. Kami boleh menggunakan DI untuk mencipta perkhidmatan gandingan longgar yang boleh diuji secara bebas daripada kebergantungan tertentu: 🎜rrreee🎜 Dalam contoh ini, DI membenarkan kami membuat perubahan tanpa mengubah suai kod UserService Pangkalan Data atau pelaksanaan pelayan HTTP. 🎜

Atas ialah kandungan terperinci Amalan terbaik suntikan pergantungan bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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