Go에서 향상된 종속성 주입 패턴
Go에서 구성요소 연결에 대한 전통적인 접근 방식은 수동으로 인스턴스화하고 기본 함수에서 종속성을 전달하는 것입니다. , 주어진 코드에서 볼 수 있듯이. 이 방법은 기능적이지만 코드베이스가 커짐에 따라 번거롭고 오류가 발생하기 쉽습니다.
이 문제를 해결하려면 다음과 같은 대체 패턴을 고려해 볼 가치가 있습니다.
1. 함수 매개변수
종속성을 함수 매개변수로 전달합니다. 이는 종속성을 쉽게 모의할 수 있도록 하여 테스트를 단순화합니다.
func someConsumer(g Guy) { fmt.Println("Hello, " + g.SomeDumbGuy()) } func main() { var d datstr someConsumer(d) }
2. 팩토리 함수
종속성이 이미 주입된 객체를 반환하는 팩토리 함수를 만듭니다. 이를 통해 종속성 주입을 중앙 집중화하고 특정 컨텍스트에 따라 종속성을 더 쉽게 구성할 수 있습니다.
func NewGuy() Guy { return &datstr{} } func someConsumer(g Guy) { fmt.Println("Hello, " + g.SomeDumbGuy()) } func main() { g := NewGuy() someConsumer(g) }
3. 미들웨어
미들웨어 기능을 사용하여 요청을 가로채고 요청 컨텍스트에 종속성을 삽입합니다. 이는 유연성을 제공하고 동적 종속성 주입을 허용합니다.
func wrapWithGuy(handler http.Handler) http.Handler { return func(w http.ResponseWriter, r *http.Request) { g := NewGuy() r.Context() = context.WithValue(r.Context(), "guy", g) handler.ServeHTTP(w, r) } } func main() { handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { g := r.Context().Value("guy").(Guy) fmt.Fprintf(w, "Hello, %s!", g.SomeDumbGuy()) }) http.Handle("/", wrapWithGuy(handler)) http.ListenAndServe(":8080", nil) }
DI 라이브러리를 피하세요
다른 언어와 달리 Go에서는 종속성 주입(DI ) 도서관. 실제로 DI 라이브러리는 불필요한 복잡성과 추상화를 가져올 수 있습니다. Go의 단순성과 명시적인 종속성 관리는 투명성과 디버깅 용이성을 향상시킵니다.
위 내용은 기본 인스턴스화 이상에서 종속성 주입을 어떻게 개선할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!