Bonjour,
Je suis en train d’essayer d’utiliser le package samber/do en le combinant avec les fonctions init()
de Go.
Mon but est déviter d’avoir un fichier d'initalisation qui va configurer mes services et mon application. Je souhaite éviter un tel fichier car il est souvent très volumineux et peu pratique à modifier.
On peut avoir un exemple de ça ici
func main() {
// Usual way to initialize out app
userFetch := usualinfra.NewUserFetch("example.com", "key")
locFetch := usualinfra.NewLocationFetch("location.com", "key")
usualApp := usualdomain.NewApp(userFetch, locFetch)
// Do stuff with our app
usualApp.DoStuff()
[...]
Ici j’initialise les services userFetch
et locFetch
que je donne en suite à mon application. Dans le cas où j’ai beaucoup de service avec beaucoups de configuration le fichier peut-être très long, c’est ce que je cherche à éviter.
Pour éviter cette suite d’initialisation de service je suis donc parti en faisant quelque chose comme ça:
func init() {
uf := do.MustInvoke[*userfetcher.UserFetch](nil)
lf := do.MustInvoke[*locationfetcher.LocationFetch](nil)
do.Provide(
nil,
func(i *do.Injector) (*App, error) {
return NewApp(uf, lf), nil
},
)
}
Dans la fonction init
du package de mon application, j’utilise samber pour récupérer les instances des service de localisation et des utilisateurs. En suite je crée mon application.
Les services de localisation et des utilisateurs sont eux crée de la même manière, dans la fonction init
de leurs package.
func init() {
do.Provide(
nil,
func(i *do.Injector) (*LocationFetch, error) {
return NewLocationFetch("location.com", "key"), nil
},
)
}
Ici on remarque que je crée mon service de localisation et je l’enregistre dans samber.
Avec cette méthode pour initialiser mes service, je me retrouve donc avec seulement ceci dans la fonction main
:
func main() {
[...]
// Initialize the app with samber/do
samberApp := do.MustInvoke[*samber.App](nil)
// Do stuff with our app
samberApp.DoStuff()
}
Quels sont vos avis sur la méthode d’utiliser les fonction init
de Go combiné à samber pour initialiser plus facilement ses service ? Est ce que vous avec des expériences avec une tel méthode ?
Voici le dépot github dans lequel sont mes exemples.