Last active
April 4, 2018 02:01
-
-
Save daemonl/713c3bd096154bcc47143a510686622c to your computer and use it in GitHub Desktop.
Go Dependency Injection
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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... | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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... | |
}) | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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... | |
}) | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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