Setting up a larger application using dependency injection always requires us developers to set up our application’s object graph.
Programming in Go there is a library that eases this task for us, offering a reflect based injector to set up the graph in a few steps, named facebookgo-inject.
In the following article I’d like to demonstrate dependency injection using this library for a small sample application.
Dependency Injection Example
First of all we need to fetch the dependency for facebookgo-inject (thanks @bborbe for showing me this library! :))
$ go get github.com/facebookgo/inject
This is our sample application – as we can see, our BookService gets the dependencies for Database and Validator injected.
package main
import (
"log"
"github.com/facebookgo/inject"
)
type Book struct {
title string
}
type BookService struct {
database Database `inject:""`
validator Validator `inject:""`
}
func (s *BookService) create(book Book) {
log.Printf("creating new book entity: %v\n", book)
if s.validator.validate(book) {
s.database.save(book)
}
}
type Database struct {
}
func (db *Database) save(entity interface{}) {
log.Printf("saving entity to database: %v", entity)
}
type Validator struct {
}
func (v *Validator) validate(entity interface{}) bool {
log.Printf("validating entity: %v", entity)
return true
}
func main() {
log.Println("starting injection example")
var graph inject.Graph
var service BookService
graph.Provide(
&inject.Object{Value: &service},
&inject.Object{Value: Database{}},
&inject.Object{Value: Validator{}}
)
graph.Populate()
log.Println("listing known objects..")
for _, obj := range graph.Objects() {
log.Printf("object known: %v\n", obj)
}
service.create(Book{title: "Some book"})
}
Running the Example
We may now run our sample application in the command line like this:
$ go run example.go
2016/11/09 16:18:21 starting injection example
2016/11/09 16:18:21 listing known objects..
2016/11/09 16:18:21 object known: *main.BookService
2016/11/09 16:18:21 creating new book entity: {Some book}
2016/11/09 16:18:21 validating entity: {Some book}
2016/11/09 16:18:21 saving entity to database: {Some book}
Tutorial Sources
Please feel free to download the tutorial sources from my GitHub repository, fork it there or clone it using Git:
git clone https://github.com/hascode/facebookgo-inject-sample.git