Translate

lunes, 27 de febrero de 2023

Inyección de dependencia en Go usando Fx parte 2

 


Seguimos con fx, ahora vamos a hacer otro ejemplo con fx y Go basados en este ejemplo hecho con spring y java.

Primero vamos a hacer una interfaz que nos permita obtener un saludo : 

type Saludor interface {

GetSaludo() string

}

Luego vamos a implementarla en español e ingles : 


type SaludorEs struct {

}

func (saludoEs SaludorEs) GetSaludo() string {

return "Hola !!"

}


type SaludorEn struct {
}

func (saludoEn SaludorEn) GetSaludo() string {
return "Hi !!"
}

Y vamos a hacer métodos que nos permitan crear estas implementaciones : 

func CrearSaludadorEs() (Saludor, error) {
return SaludorEs{}, nil
}

func CrearSaludadorEn() (Saludor, error) {
return SaludorEn{}, nil
}

Y ahora vamos a hacer un método que sea polimorfico que imprima el saludo : 


func Saludar(saludor Saludor) {
fmt.Println(saludor.GetSaludo())
}

Como ven referencia a la interfaz por lo tanto se puede usar con el SaludadorEs y el SaludadorEn porque implementan esta interfaz. 

Y por ultimo vamos hacer 2 app de fx una en español y la otra en ingles : 


func main() {
appEs := fx.New(

fx.Provide(
CrearSaludadorEs,
),

fx.Invoke(Saludar),
)

ctxEs, cancelEs := context.WithCancel(context.Background())
defer cancelEs()
if err := appEs.Start(ctxEs); err != nil {
log.Fatal(err)
}

appEn := fx.New(

fx.Provide(
CrearSaludadorEn,
),

fx.Invoke(Saludar),
)

ctxEn, cancelEn := context.WithCancel(context.Background())
defer cancelEn()
if err := appEn.Start(ctxEn); err != nil {
log.Fatal(err)
}
}

y la salida es la siguiente : 

[Fx] PROVIDE    main.Saludor <= main.CrearSaludadorEs()
[Fx] PROVIDE    fx.Lifecycle <= go.uber.org/fx.New.func1()
[Fx] PROVIDE    fx.Shutdowner <= go.uber.org/fx.(*App).shutdowner-fm()
[Fx] PROVIDE    fx.DotGraph <= go.uber.org/fx.(*App).dotGraph-fm()
[Fx] INVOKE             main.Saludar()
Hola !!
[Fx] RUNNING
[Fx] PROVIDE    main.Saludor <= main.CrearSaludadorEn()
[Fx] PROVIDE    fx.Lifecycle <= go.uber.org/fx.New.func1()
[Fx] PROVIDE    fx.Shutdowner <= go.uber.org/fx.(*App).shutdowner-fm()
[Fx] PROVIDE    fx.DotGraph <= go.uber.org/fx.(*App).dotGraph-fm()
[Fx] INVOKE             main.Saludar()
Hi !!
[Fx] RUNNING

Y listo!!