- vừa được xem lúc

Dependency Injection Trong Go

0 0 12

Người đăng: Toan Pham

Theo Viblo Asia

I. Định Nghĩa

Dependency Injection là kỹ thuật giúp giảm sự phụ thuộc giữa các module code bằng cách "tiêm" các dependencies (các đối tượng hoặc dữ liệu mà một đối tượng cần để thực hiện công việc của nó) thay vì để đối tượng tự tạo ra chúng. Trong ngôn ngữ Go, điều này thường được thực hiện thông qua interfaces. Một đối tượng chỉ cần định nghĩa những gì nó cần (thông qua một interface) và các đối tượng khác có thể cung cấp những gì nó cần nếu chúng tuân thủ interface đó.

II. Ví dụ

Trong ví dụ này chúng ta sẽ tạo ra một dịch vụ gửi tin nhắn qua Email và SMS.

Đầu tiên, chúng ta định nghĩa một interface MessageService với một phương thức SendMessage. Interface này không cung cấp chi tiết về việc làm thế nào để gửi tin nhắn, chỉ đơn giản là yêu cầu một "dịch vụ tin nhắn" phải có khả năng gửi tin nhắn.

 // MessageService handles some message type MessageService interface { SendMessage(message string, receiver string) error }

Tiếp theo, chúng ta định nghĩa hai struct SMSServiceEmailService, cả hai đều implement MessageService interface. Điều này có nghĩa là cả hai đều cung cấp phương thức SendMessage, nhưng cách thực hiện của mỗi dịch vụ có thể khác nhau.

 // SMSService is a implementation of MessageService type SMSService struct{} func (s *SMSService) SendMessage(message string, receiver string) error { fmt.Printf("Send SMS: %s to %s\n", message, receiver) return nil } // EmailService is another implementation of MessageService type EmailService struct{} func (e *EmailService) SendMessage(message string, receiver string) error { fmt.Printf("Send Email: %s to %s\n", message, receiver) return nil }

Tiếp theo tạo MyApplication struct có một trường messageService kiểu MessageService.

// MyApplication uses a service to send messages
type MyApplication struct { messageService MessageService
} func (a *MyApplication) processMessages(message string, receiver string) error { err := a.messageService.SendMessage(message, receiver) if err != nil { return err } return nil
}

Điều này có nghĩa là MyApplication không cần biết chi tiết về việc làm thế nào để gửi tin nhắn, chỉ cần biết rằng nó có một dịch vụ có thể gửi tin nhắn. Đây chính là Dependency Injection (DI): MyApplication không tạo ra một MessageService, thay vào đó, nó được cung cấp một MessageService khi được tạo.

Trong hàm main, chúng ta tạo ra một SMSServiceEmailService, và "tiêm" chúng vào MyApplication thông qua trường messageService.

func main() { smsService := &SMSService{} app := &MyApplication{messageService: smsService} app.processMessages("Hello World", "123") emailService := &EmailService{} app.messageService = emailService app.processMessages("Hello World", "abc@example.com")
} 

Trong ví dụ trên, MyApplication không cần biết rằng nó đang sử dụng SMSService hay EmailService để gửi tin nhắn. Nó chỉ cần biết rằng nó có một dịch vụ để gửi tin nhắn. Điều này giúp giảm sự phụ thuộc giữa các module và giúp chúng ta dễ dàng thay đổi hoặc thử nghiệm với các dịch vụ khác nhau.

Bình luận

Bài viết tương tự

- vừa được xem lúc

gRPC - Nó là gì và có nên sử dụng hay không?

Nhân một ngày rảnh rỗi, mình ngồi đọc lại RPC cũng như gRPC viết lại để nhớ lâu hơn. Vấn đề là gì và tại sao cần nó .

0 0 131

- vừa được xem lúc

Embedded Template in Go

Getting Start. Part of developing a web application usually revolves around working with HTML as user interface.

0 0 56

- vừa được xem lúc

Tạo Resful API đơn giản với Echo framework và MySQL

1. Giới thiệu.

0 0 60

- vừa được xem lúc

Sử dụng goquery trong golang để crawler thông tin các website Việt Nam bị deface trên mirror-h.org

. Trong bài viết này, mình sẽ cùng mọi người khám phá một package thu thập dữ liệu có tên là goquery của golang. Mục tiêu chính của chương trình crawler này sẽ là lấy thông tin các website Việt Nam bị deface (là tấn công, phá hoại website, làm thay đổi giao diện hiển thị của một trang web, khi người

0 0 237

- vừa được xem lúc

Tạo ứng dụng craw dữ liệu bing với Golang, Mysql driver

Chào mọi người . Lâu lâu ta lại gặp nhau 1 lần, để tiếp tục series chia sẻ kiến thức về tech, hôm nay mình sẽ tìm hiểu và chia sẻ về 1 ngôn ngữ đang khá hot trong cộng đồng IT đó là Golang.

0 0 75

- vừa được xem lúc

Golang: Rest api and routing using MUX

Routing with MUX. Let's create a simple CRUD api for a blog site. # All . GET articles/ .

0 0 54