تزریق وابستگی در گولنگ با Google Wire

تزریق وابستگی (Dependency Injection یا DI) یک الگوی طراحی است که در آن وابستگی‌های یک کلاس یا تابع از بیرون به آن ارائه می‌شود. این الگو باعث جداسازی بهتر کد، افزایش تست‌پذیری و انعطاف‌پذیری بیشتر برنامه می‌شود. در زبان Go به دلیل عدم وجود ویژگی‌های خاصی مانند constructor injection به شکل بومی، استفاده از ابزارهای تزریق وابستگی مانند Google Wire بسیار مفید است.


Google Wire چیست؟

Google Wire یک ابزار تولید کد (Code Generation) است که توسط گوگل توسعه داده شده و برای مدیریت وابستگی‌ها در برنامه‌های گولنگ استفاده می‌شود. این ابزار به جای اجرای زمان اجرا (Runtime) از تولید کد در زمان کامپایل (Compile Time) استفاده می‌کند که باعث بهینه‌تر شدن عملکرد برنامه می‌شود.

ویژگی‌های Google Wire

  • تولید کد به جای استفاده از Reflection

  • بهینه بودن از نظر عملکرد

  • ساده‌سازی فرآیند مدیریت وابستگی‌ها

  • هماهنگی کامل با زبان Go و ابزار go generate

1. نصب و راه اندازی

در ابتدا یک پروژه گولنگی درست میکنیم و دستور زیر از طریق ترمینال اجرا میکنیم:

go mod init

حالا نیازه که پکیج google/wire رو نصب کنیم:

go install github.com/google/wire/cmd/wire@latest

این پکیج، یک پکیج رسمی از گوگل هست و برای اطلاعات بیشتر میتونید گیت هاب این پکیج مشاهده کنید.


2. ساخت یک اپلیکیشن ساده

مرحله بعد ما میخوایم یک اپلیکیشن ساده درست کنیم و تزریق وابستگی رو یاد بگیریم. خب اپلیکیشن ما به یک سرویس نیاز خواهد داشت و ما به شکل زیر یک سرویس تعریف میکنیم:

package main

import "fmt"

// Service struct
type Service struct{}

// Greet Method of Service
func (s *Service) Greet(name string) string {
    return "Hello, " + name + "!"
}

// NewService is a constructor function
func NewService() *Service {
    return &Service{}
}

در مرحله بعد ما به یک App نیازمند خواهیم بود:

// App struct depends on Service
type App struct {
    service *Service
}

// NewApp creates an instance of App
func NewApp(service *Service) *App {
    return &App{service: service}
}

// Run method
func (a *App) Run() {
    fmt.Println(a.service.Greet("Golang"))
}

تا اینجا اپلیکیشن ما به یک سرویس نیازمنده، برای اینکار از Google Wire استفاده میکنیم، پس یک فایل به نام wire.go میسازیم و کد زیر درونش وارد میکنیم:

//go:build wireinject
// +build wireinject

package main

import "github.com/google/wire"

// InitializeApp sets up dependencies using Wire
func InitializeApp() *App {
    wire.Build(NewService, NewApp)
    return &App{} // This return is only for Wire to generate code.
}

به صورت خیلی راحت اومدیم سرویس به اپ تزریق کردیم. حالا نیاز داریم که Google Wire برای ما تزریق وابستگی انجام بده با استفاده از کامند زیر:

wire

بعد از وارد کردن این کامند، برای شما یک فایل به نام wire_gen.go درست خواهد شد.


3. راه اندازی اپلیکیشن

حالا در فانکشن "()main" از تزریق وابستگیمون استفاده میکنیم:

package main

func main() {
    app := InitializeApp()
    app.Run()
}

بعد اپلیکیشن خودمون ران میکنیم:

go run .

خروجی ما:

Hello, Golang!

Google Wire با تولید کدهای تکراری، تزریق وابستگی را در گولنگ ساده می‌کند. این کار باعث می‌شود برنامه‌ها ماژولار، قابل نگهداری و تست‌پذیرتر شوند.



0 🔥
0 🎉
0 😮
0 👍
0 💜
0 👏
میلاد خسروی
نویسنده کد نیوز

برنامه نویس فان | Fun Developer یک آدم ساده که عاشق برنامه نویسی و کد زدنه :) تلاش میکنه تا به بقیه کمک کنه. توسعه دهنده هسته لاراول و فضای اوپن سورس. فاندر پرانتز و کد نیوز.

0+ نظر

برای ثبت نظر ابتدا ورود کنید.

0 نظر

    اولین نفر باش که نظر ثبت میکنی :) یعنی یه کامنت به ما نمیرسه 😁