Add usage example for the service container
This commit is contained in:
parent
100cf83917
commit
bd676c234f
|
@ -1,3 +1,7 @@
|
|||
// Package service -
|
||||
// Propose une implémentation
|
||||
// simple d'un conteneur de service afin de permettre
|
||||
// l'injection de dépendances dans les applications web
|
||||
package service
|
||||
|
||||
import (
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
package service
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// On déclare le nom de notre nouveau service
|
||||
const MyServiceName Name = "myService"
|
||||
|
||||
// On déclare le type de notre nouveau service
|
||||
type MyService struct{}
|
||||
|
||||
// Une simple méthode exposée sur notre service
|
||||
func (s *MyService) HelloWorld() {
|
||||
fmt.Println("Hello World !")
|
||||
}
|
||||
|
||||
func Example_usage() {
|
||||
|
||||
// On initialise un conteneur de services vide
|
||||
container := NewContainer()
|
||||
|
||||
// On créait un "fournisseur" pour notre nouveau service.
|
||||
// Celui ci sera utilisé pour créer une nouvelle instance du service
|
||||
// à chaque fois qu'un appel à container.Service(MyServiceName)
|
||||
// sera fait
|
||||
myServiceProvider := func(container *Container) (interface{}, error) {
|
||||
// On peut potentiellement appeler d'autres services ici
|
||||
// via le conteneur afin d'initialiser notre propre service
|
||||
return &MyService{}, nil
|
||||
}
|
||||
|
||||
// On expose le fournisseur de service dans notre conteneur de service
|
||||
// Cette opération est typiquement faite lors de l'initialisation de
|
||||
// l'application, avant le lancement du serveur HTTP
|
||||
container.Provide(MyServiceName, myServiceProvider)
|
||||
|
||||
// Plus tard, on peut utiliser le conteneur pour récupérer une instance
|
||||
// de notre service
|
||||
service, err := container.Service(MyServiceName)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Le service est retourné en tant que interface{}, il faut utiliser
|
||||
// de l'assertion de type afin de pouvoir l'utiliser concrètement.
|
||||
|
||||
// Les packages de services proposés dans goweb exposent tous les méthodes
|
||||
// From(container *service.Container) (Service, error)
|
||||
// et Must(container *service.Container) Service qui permettent de simplifier
|
||||
// ce processus.
|
||||
|
||||
myService, ok := service.(*MyService)
|
||||
if !ok {
|
||||
panic(errors.New("unexpected implementation"))
|
||||
}
|
||||
|
||||
// On peut maintenant utiliser le service
|
||||
myService.HelloWorld()
|
||||
|
||||
}
|
Loading…
Reference in New Issue