Go'da Constructor Injection: Bağımlılıkları Doğru Geçmek
Constructor injection, bir struct'ın ihtiyaç duyduğu bağımlılıkları (başka nesneler, servisler, veritabanı bağlantıları) oluşturulurken dışarıdan geçmek demek. Go'da bu, fonksiyonlar aracılığıyla yapılır ve kodun test edilebilirliğini çok arttırır.
Eğer bir struct kendi bağımlılıklarını içinde oluşturursa, o bağımlılığı test sırasında sahte bir versiyon ile değiştiremezsin. Constructor injection kullanınca, test için mock nesneler kolayca geçebilirsin.
Praktik örneğe bakalım. Bir e-ticaret uygulamasında sipariş işleyen bir struct'ımız var. Bu struct'ın bir veritabanı ve bir e-posta servisi gerekli.
1package main23import "fmt"45type Database struct {6connectionString string7}89func (d *Database) SaveOrder(orderId string) error {10fmt.Printf("Sipariş %s veritabanına kaydedildi\n", orderId)11return nil12}1314type EmailService struct {15smtpServer string16}1718func (e *EmailService) SendConfirmation(email string) error {19fmt.Printf("%s adresine onay e-postası gönderildi\n", email)20return nil21}2223type OrderProcessor struct {24db *Database25email *EmailService26}2728func NewOrderProcessor(db *Database, email *EmailService) *OrderProcessor {29return &OrderProcessor{30db: db,31email: email,32}33}3435func (op *OrderProcessor) ProcessOrder(orderId string, customerEmail string) error {36op.db.SaveOrder(orderId)37op.email.SendConfirmation(customerEmail)38fmt.Printf("Sipariş %s işlendi\n", orderId)39return nil40}4142func main() {43db:= &Database{connectionString: "postgres://..."}44email:= &EmailService{smtpServer: "smtp.example.com"}4546processor:= NewOrderProcessor(db, email)47processor.ProcessOrder("ORD-001", "user@example.com")48}Çıktı:
1Sipariş ORD-001 veritabanına kaydedildi2user@example.com adresine onay e-postası gönderildi3Sipariş ORD-001 işlendiGördüğün gibi NewOrderProcessor fonksiyonu (constructor) parametreleri alıyor ve struct'ı döndürüyor. Test yazarken Database ve EmailService yerine mock versiyonlarını geçebilirsin.
Test örneği:
1type MockDatabase struct {}23func (m *MockDatabase) SaveOrder(orderId string) error {4return nil5}67type MockEmailService struct {}89func (m *MockEmailService) SendConfirmation(email string) error {10return nil11}1213func TestOrderProcessor() {14mockDb:= &MockDatabase{}15mockEmail:= &MockEmailService{}1617processor:= NewOrderProcessor(mockDb, mockEmail)18err:= processor.ProcessOrder("TEST-001", "test@example.com")1920if err!= nil {21fmt.Println("Test başarısız")22} else {23fmt.Println("Test başarılı")24}25}Bu şekilde gerçek veritabanı ve e-posta servisi kullanmadan test edebilirsin. Constructor injection Go'da sadece bir desen değil, kodun bakımı ve genişletilmesi için pratik bir yol.
0 yorum