Golang 实现依赖注入
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))
}