> 백엔드 개발 > Golang > 기본 인스턴스화 이상에서 종속성 주입을 어떻게 개선할 수 있습니까?

기본 인스턴스화 이상에서 종속성 주입을 어떻게 개선할 수 있습니까?

Barbara Streisand
풀어 주다: 2024-12-21 09:48:13
원래의
199명이 탐색했습니다.

How Can I Improve Dependency Injection in Go Beyond Basic Instantiation?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿