Golang 实现依赖注入

时间:2025-03-02 15:28:32
package main import ( "fmt" "log" "net/http" "/dig" ) type Config struct{ Name string `json:"name"` } type DB struct { Config *Config } type PersonRepositor struct { DB *DB } func (p PersonRepositor) Hello(){ fmt.Printf("hello, test for:%s\n", p.DB.Config.Name) } type PersonService struct { PersonRepositor *PersonRepositor } type Server struct { PersonService *PersonService } func (s *Server) Run(){ fmt.Print("Server Run\n") s.PersonService.PersonRepositor.Hello() HTTPServer() } func NewConfig() *Config{ fmt.Print("new Config\n") c := new(Config) c.Name = "/dig" return c } func ConnectDatabase(c *Config) *DB { fmt.Printf("new DB, need config:%+v\n", c) db := new(DB) db.Config = c return db } func NewPersonRepository(db *DB) *PersonRepositor { fmt.Printf("new PersonRepositor, need DB:%+v\n", db) p := new(PersonRepositor) p.DB = db return p } func NewPersonService(personRepositor *PersonRepositor) *PersonService { fmt.Printf("new PersonService, need PersonRepositor:%+v\n", personRepositor) p := new(PersonService) p.PersonRepositor = personRepositor return p } func NewServer(personService *PersonService) *Server { fmt.Printf("new PersonService, need PersonRepositor:%+v\n", personService) s := new(Server) s.PersonService = personService return s } func BuildContainer() *dig.Container { container := dig.New() container.Provide(NewConfig) container.Provide(ConnectDatabase) container.Provide(NewPersonRepository) container.Provide(NewPersonService) container.Provide(NewServer) return container } func main() { container := BuildContainer() err := container.Invoke(func(server *Server) { server.Run() HTTPServer() }) if err != nil { panic(err) } } func myHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello there!\n") } func HTTPServer() { http.HandleFunc("/", myHandler) // 设置访问路由 log.Fatal(http.ListenAndServe(":8080", nil)) }