Skip to content

Instantly share code, notes, and snippets.

@daemonl
Last active April 4, 2018 02:01
Show Gist options
  • Save daemonl/713c3bd096154bcc47143a510686622c to your computer and use it in GitHub Desktop.
Save daemonl/713c3bd096154bcc47143a510686622c to your computer and use it in GitHub Desktop.
Go Dependency Injection
type UserHandlerDependencies struct {
UserDatastore
UserEnricher
}
func BuildUserHandler(deps UserHandlerDependencies) http.Handler {
return http.HandlerFunc(rw http.ResponseWriter, req *http.Request) {
// Parse Request
user, err := deps.GetUser(username)
enriched := deps.EnrichUser(user)
// etc...
}
}
func NewGetUserHandler(datastore UserDatastore, enricher UserEnricher) http.Handler {
return http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
// Parse Request
user, err := datastore.GetUser(username)
enriched := enricher.EnrichUser(user)
// etc...
})
}
// Only works for 1-3ish dependencies
type UserHandler struct {
UserDatastore
UserEnricher
}
func (userHandler) HandleGetUser(rw http.ResponseWriter, req *http.Request) {
// Parse Request
user, err := userHandler.GetUser(username)
enriched := userHandler.EnrichUser(user)
// etc...
}
// Overkill for 1-2 dependencies
func NewGetUserHandler(deps interface{
GetUserDatastore() UserDatastore
GetUserEnricher() UserEnricher
}) http.Handler {
datastore := deps.GetUserDatastore()
enricher := deps.GetUserEnricher()
return http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
// Parse Request
user, err := datastore.GetUser(username)
enriched := enricher.EnrichUser(user)
// etc...
})
}
func NewGetUserHandler(userDatastoreBuilder interface{
GetUserDatastore() UserDatastore
}, userEnricherBuilder interface{
GetUserEnricher() UserEnricher
}) http.Handler {
datastore := userDatastirBuilder.GetUserDatastore()
enricher := userEnricherBuilder.GetUserEnricher()
return http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
// Parse Request
user, err := datastore.GetUser(username)
enriched := enricher.EnrichUser(user)
// etc...
})
}
var UserDatastore interface{
// actual used methods
}
var UserEnricher interface{
// actual used methods
}
// OR
var UserDatastore users.Datastore
var UserEnricher users.Enricher
func HandleGetUser(rw http.ResponseWriter, req *http.Request) {
// Parse Request
user, err := UserDatastore.GetUser(username)
enriched := UserEnricher.EnrichUser(user)
// etc...
}
// Easy to forget, runtime error, unless there is a sane default
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment