SlideShare uma empresa Scribd logo
1 de 25
Baixar para ler offline
INJEÇÃO DE
DEPENDÊNCIAS
CAMPINAS SP, NOV 25 2019
Tiago Angelo
Software Engineer
O que é Injeção de dependência? 01
Por quê?
Containers de Injeção de Dependências
Alternativas para Go
Wire
Let’s Code!
02
03
04
05
06
WHOAMI
Tiago Angelo
Software Engineer
➔ microservices
➔ containers e service mesh
➔ Java
➔ Go
{
SEM INJEÇÃO DE DEPENDÊNCIAS
a struct que
verifica o clima é
responsável por
instanciar o logger
e a que identifica a
localização atual e
01. O QUE É INJEÇÃO DE DEPENDÊNCIA?
// declarações de pacote e importações omitidas
type Weather struct {
log log.Logger
locator location.Locator
}
func NewWeather() *Weather {
log := log.NewZapLogger()
locator := location.NewIPStack()
return &Weather{log: log, locator: locator}
}
func (w *Weather) Check() string {
w.log.Info("Checking the current weather")
local := w.locator.WhereAmI()
return w.CheckByCoord(local.Longitude, local.Latitude)
}
func (w *Weather) CheckByCoord(lat float64, lon float64) string { … }
interfaces
conhece as
implementações
dessas
interfaces
{
COM INJEÇÃO DE DEPENDÊNCIAS
o mesmo código
usando DI
01. O QUE É INJEÇÃO DE DEPENDÊNCIA?
// declarações de pacote e importações omitidas
type Weather struct {
log log.Logger
locator location.Locator
}
func NewWeather(log log.Logger, locator location.Locator) *Weather {
return &Weather{log: log, locator: locator}
}
func (w *Weather) Check() string {
w.log.Info("Checking the current weather")
local := w.locator.WhereAmI()
return w.CheckByCoord(local.Longitude, local.Latitude)
}
func (w *Weather) CheckByCoord(lat float64, lon float64) string { … }
INVERSÃO DE CONTROLE
02. POR QUÊ?
Por quê?
● garantir o princípio de responsabilidade única.
Como?
● movendo para outras classes quaisquer
responsabilidades adicionais que uma classe
possua, além de sua principal.
INJEÇÃO DE DEPENDÊNCIAS
02. POR QUÊ?
Por quê?
● implementar o princípio de inversão de controle;
● obter baixo acoplamento entre as classes.
Como?
● movendo a criação do objeto de dependência
para fora da classe e fornecendo esses objetos
para ela.
CONTAINERS DE INJEÇÃO DE DEPENDÊNCIAS
● também conhecidos como Containers de Inversão de Controle (IoC);
● fazem a ligação entre as abstrações e os tipos concretos que a implementam;
● sabe como instanciar as implementações;
● analisam os tipos de cada argumento do construtor e injeta as dependências nele.
Exemplos
03. CONTAINERS DE INJEÇÃO DE DEPENDÊNCIAS
● Weld
● Spring
● Guice
● Salta
● Dagger
Frameworks para Go
04. ALTERNATIVAS PARA GO
● Uber's Dig
● Facebook's Inject
● Google's Wire
Wire
05. WIRE
● surgiu como parte do projeto Go Cloud;
● inspirado no Dagger 2 de Java;
● roda como um gerador de código e por isso
opera sem uso de reflection;
● código gerado é legível.
1. Instalação
05. WIRE
$ go get github.com/google/wire/cmd/wire
● no diretório da sua aplicação, execute:
2.1. Definindo Providers
05. WIRE
// declarações de pacote e importações omitidas
type Weather struct {
log log.Logger
locator location.Locator
}
func NewWeather(l log.Logger, ll location.Locator) *Weather { // Provider: normalmente são construtores
return &Weather{log: l, locator: ll}
}
func (w *Weather) Check() string {
w.log.Info("Checking the current weather")
local, _ := w.locator.WhereAmI()
return w.CheckByCoord(local.Longitude, local.Latitude)
}
func (w *Weather) CheckByCoord(lat float64, lon float64) string { ... }
2.2. Definindo Providers
05. WIRE
package log
import (
"go.uber.org/zap"
defaultLogger "log"
)
func NewSugaredLogger() *zap.SugaredLogger { // Provider: uma função capaz de produzir um valor
logger, err := zap.NewDevelopment()
if err != nil {
defaultLogger.Fatal(err)
}
log := logger.Sugar()
log.Debug("criando nova instância de SugaredLogger da biblioteca Zap")
return log
}
2.3. Definindo Providers
05. WIRE
package log
import (
"github.com/google/wire"
)
var Providers = wire.NewSet( // Providers podem ser agrupados
NewSugaredLogger,
NewZapLogger,
wire.Bind(new(Logger), new(*ZapLogger)),
)
3. Definindo o Injector
05. WIRE
//+build wireinject - essa tag garante que esse arquivo não seja incluído na build final.
package main
import (
"github.com/angelokurtis/golang-meetup/internal/http"
"github.com/angelokurtis/golang-meetup/internal/log"
"github.com/angelokurtis/golang-meetup/pkg/forecast"
"github.com/angelokurtis/golang-meetup/pkg/location"
"github.com/google/wire"
)
func Initialize() *Weather {
wire.Build(http.Providers, log.Providers, forecast.Providers, location.Providers)
return &Weather{}
}
4. Gerar o Injector
05. WIRE
$ wire
● no diretório da sua aplicação, execute:
o resultado será salvo em um arquivo chamado
wire_gen.go
Obrigado!
kurtisangelo
angelokurtis
tiagoangelo
Link pra demo:
github.com/angelokurtis/golang-meetup

Mais conteúdo relacionado

Mais procurados

Azure Pipeline Tutorial | Azure DevOps Tutorial | Edureka
Azure Pipeline Tutorial | Azure DevOps Tutorial | EdurekaAzure Pipeline Tutorial | Azure DevOps Tutorial | Edureka
Azure Pipeline Tutorial | Azure DevOps Tutorial | EdurekaEdureka!
 
Mulesoft with ELK (Elastic Search, Log stash, Kibana)
Mulesoft with ELK (Elastic Search, Log stash, Kibana)Mulesoft with ELK (Elastic Search, Log stash, Kibana)
Mulesoft with ELK (Elastic Search, Log stash, Kibana)Gaurav Sethi
 
Az 104 session 8 azure monitoring
Az 104 session 8 azure monitoringAz 104 session 8 azure monitoring
Az 104 session 8 azure monitoringAzureEzy1
 
Azure DevOps Tutorial | Developing CI/ CD Pipelines On Azure | Edureka
Azure DevOps Tutorial | Developing CI/ CD Pipelines On Azure | EdurekaAzure DevOps Tutorial | Developing CI/ CD Pipelines On Azure | Edureka
Azure DevOps Tutorial | Developing CI/ CD Pipelines On Azure | EdurekaEdureka!
 
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!pyrasis
 
K8s, Amazon EKS - 유재석, AWS 솔루션즈 아키텍트
K8s, Amazon EKS - 유재석, AWS 솔루션즈 아키텍트K8s, Amazon EKS - 유재석, AWS 솔루션즈 아키텍트
K8s, Amazon EKS - 유재석, AWS 솔루션즈 아키텍트Amazon Web Services Korea
 
Encrypt your volumes with barbican open stack 2018
Encrypt your volumes with barbican open stack 2018Encrypt your volumes with barbican open stack 2018
Encrypt your volumes with barbican open stack 2018Duncan Wannamaker
 
Nodeless scaling with Karpenter
Nodeless scaling with KarpenterNodeless scaling with Karpenter
Nodeless scaling with KarpenterMarko Bevc
 
Introduction to Docker
Introduction to DockerIntroduction to Docker
Introduction to DockerAditya Konarde
 
AWS CodeCommit, CodeDeploy & CodePipeline
AWS CodeCommit, CodeDeploy & CodePipelineAWS CodeCommit, CodeDeploy & CodePipeline
AWS CodeCommit, CodeDeploy & CodePipelineJulien SIMON
 
k8s practice 2023.pptx
k8s practice 2023.pptxk8s practice 2023.pptx
k8s practice 2023.pptxwonyong hwang
 
(DVO306) AWS CodeDeploy: Automating Your Software Deployments
(DVO306) AWS CodeDeploy: Automating Your Software Deployments(DVO306) AWS CodeDeploy: Automating Your Software Deployments
(DVO306) AWS CodeDeploy: Automating Your Software DeploymentsAmazon Web Services
 
C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴명신 김
 
DevOps without DevOps Tools
DevOps without DevOps ToolsDevOps without DevOps Tools
DevOps without DevOps ToolsJagatveer Singh
 
Developing with Docker for the Arm Architecture
Developing with Docker for the Arm ArchitectureDeveloping with Docker for the Arm Architecture
Developing with Docker for the Arm ArchitectureDocker, Inc.
 
Introduce Google Kubernetes
Introduce Google KubernetesIntroduce Google Kubernetes
Introduce Google KubernetesYongbok Kim
 
Beautfiul world of Flutter Testing
Beautfiul world of Flutter TestingBeautfiul world of Flutter Testing
Beautfiul world of Flutter TestingMax Weber
 
Introduction to Github Actions
Introduction to Github ActionsIntroduction to Github Actions
Introduction to Github ActionsKnoldus Inc.
 

Mais procurados (20)

Azure Pipeline Tutorial | Azure DevOps Tutorial | Edureka
Azure Pipeline Tutorial | Azure DevOps Tutorial | EdurekaAzure Pipeline Tutorial | Azure DevOps Tutorial | Edureka
Azure Pipeline Tutorial | Azure DevOps Tutorial | Edureka
 
Mulesoft with ELK (Elastic Search, Log stash, Kibana)
Mulesoft with ELK (Elastic Search, Log stash, Kibana)Mulesoft with ELK (Elastic Search, Log stash, Kibana)
Mulesoft with ELK (Elastic Search, Log stash, Kibana)
 
Az 104 session 8 azure monitoring
Az 104 session 8 azure monitoringAz 104 session 8 azure monitoring
Az 104 session 8 azure monitoring
 
Azure DevOps Tutorial | Developing CI/ CD Pipelines On Azure | Edureka
Azure DevOps Tutorial | Developing CI/ CD Pipelines On Azure | EdurekaAzure DevOps Tutorial | Developing CI/ CD Pipelines On Azure | Edureka
Azure DevOps Tutorial | Developing CI/ CD Pipelines On Azure | Edureka
 
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
 
K8s, Amazon EKS - 유재석, AWS 솔루션즈 아키텍트
K8s, Amazon EKS - 유재석, AWS 솔루션즈 아키텍트K8s, Amazon EKS - 유재석, AWS 솔루션즈 아키텍트
K8s, Amazon EKS - 유재석, AWS 솔루션즈 아키텍트
 
Encrypt your volumes with barbican open stack 2018
Encrypt your volumes with barbican open stack 2018Encrypt your volumes with barbican open stack 2018
Encrypt your volumes with barbican open stack 2018
 
Nodeless scaling with Karpenter
Nodeless scaling with KarpenterNodeless scaling with Karpenter
Nodeless scaling with Karpenter
 
Introduction to Docker
Introduction to DockerIntroduction to Docker
Introduction to Docker
 
AWS CodeCommit, CodeDeploy & CodePipeline
AWS CodeCommit, CodeDeploy & CodePipelineAWS CodeCommit, CodeDeploy & CodePipeline
AWS CodeCommit, CodeDeploy & CodePipeline
 
k8s practice 2023.pptx
k8s practice 2023.pptxk8s practice 2023.pptx
k8s practice 2023.pptx
 
(DVO306) AWS CodeDeploy: Automating Your Software Deployments
(DVO306) AWS CodeDeploy: Automating Your Software Deployments(DVO306) AWS CodeDeploy: Automating Your Software Deployments
(DVO306) AWS CodeDeploy: Automating Your Software Deployments
 
C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴
 
DevOps without DevOps Tools
DevOps without DevOps ToolsDevOps without DevOps Tools
DevOps without DevOps Tools
 
Developing with Docker for the Arm Architecture
Developing with Docker for the Arm ArchitectureDeveloping with Docker for the Arm Architecture
Developing with Docker for the Arm Architecture
 
spring-api-rest.pdf
spring-api-rest.pdfspring-api-rest.pdf
spring-api-rest.pdf
 
Introduce Google Kubernetes
Introduce Google KubernetesIntroduce Google Kubernetes
Introduce Google Kubernetes
 
Beautfiul world of Flutter Testing
Beautfiul world of Flutter TestingBeautfiul world of Flutter Testing
Beautfiul world of Flutter Testing
 
Dojo tutorial
Dojo tutorialDojo tutorial
Dojo tutorial
 
Introduction to Github Actions
Introduction to Github ActionsIntroduction to Github Actions
Introduction to Github Actions
 

Semelhante a Injeção de dependências em Go com Wire

Dagger 2 Injeção de dependências no mundo Android
Dagger 2 Injeção de dependências no mundo AndroidDagger 2 Injeção de dependências no mundo Android
Dagger 2 Injeção de dependências no mundo AndroidClerton Leal
 
O framework spring
O framework springO framework spring
O framework springBruno Catão
 
better faster stronger dagger
better faster stronger daggerbetter faster stronger dagger
better faster stronger daggertdc-globalcode
 
Dependency Injection com Kotlin - Thais Aquino
Dependency Injection com Kotlin - Thais AquinoDependency Injection com Kotlin - Thais Aquino
Dependency Injection com Kotlin - Thais AquinoiMasters
 
Spring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutosSpring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutosphelypploch
 
Source-to-container no mundo real
Source-to-container no mundo realSource-to-container no mundo real
Source-to-container no mundo realEvandro Silvestre
 
Curso de Verão - Aula 02 - Orquestração de Contêineres
Curso de Verão - Aula 02 - Orquestração de ContêineresCurso de Verão - Aula 02 - Orquestração de Contêineres
Curso de Verão - Aula 02 - Orquestração de ContêineresGuilhermeJorgeAragod
 
Criando operators para Kubernetes usando Go - v2
Criando operators para Kubernetes usando Go - v2Criando operators para Kubernetes usando Go - v2
Criando operators para Kubernetes usando Go - v2Matheus Moraes
 
Angular 2, TypeScript e Além
Angular 2, TypeScript e AlémAngular 2, TypeScript e Além
Angular 2, TypeScript e AlémAndre Baltieri
 
12 Factor App Docker na Cloud e outras buzzwords
12 Factor App Docker na Cloud e outras buzzwords12 Factor App Docker na Cloud e outras buzzwords
12 Factor App Docker na Cloud e outras buzzwordsWaldemar Neto
 
JHipster - Produtividade e Maturidade em suas mãos
JHipster - Produtividade e Maturidade em suas mãosJHipster - Produtividade e Maturidade em suas mãos
JHipster - Produtividade e Maturidade em suas mãosThiago Soares
 
Vuejs Angularjs e Reactjs. Veja as diferenças de cada framework!
Vuejs Angularjs e Reactjs. Veja as diferenças de cada framework!Vuejs Angularjs e Reactjs. Veja as diferenças de cada framework!
Vuejs Angularjs e Reactjs. Veja as diferenças de cada framework!José Barbosa
 

Semelhante a Injeção de dependências em Go com Wire (20)

Dagger 2 Injeção de dependências no mundo Android
Dagger 2 Injeção de dependências no mundo AndroidDagger 2 Injeção de dependências no mundo Android
Dagger 2 Injeção de dependências no mundo Android
 
Power mock
Power mockPower mock
Power mock
 
Testes: Por onde Começar?
Testes: Por onde Começar?Testes: Por onde Começar?
Testes: Por onde Começar?
 
O framework spring
O framework springO framework spring
O framework spring
 
Angular 2
Angular 2Angular 2
Angular 2
 
GDG Angular 2
GDG Angular 2GDG Angular 2
GDG Angular 2
 
better faster stronger dagger
better faster stronger daggerbetter faster stronger dagger
better faster stronger dagger
 
Dependency Injection com Kotlin - Thais Aquino
Dependency Injection com Kotlin - Thais AquinoDependency Injection com Kotlin - Thais Aquino
Dependency Injection com Kotlin - Thais Aquino
 
Spring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutosSpring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutos
 
Grails
GrailsGrails
Grails
 
Source-to-container no mundo real
Source-to-container no mundo realSource-to-container no mundo real
Source-to-container no mundo real
 
Curso de Verão - Aula 02 - Orquestração de Contêineres
Curso de Verão - Aula 02 - Orquestração de ContêineresCurso de Verão - Aula 02 - Orquestração de Contêineres
Curso de Verão - Aula 02 - Orquestração de Contêineres
 
Criando operators para Kubernetes usando Go - v2
Criando operators para Kubernetes usando Go - v2Criando operators para Kubernetes usando Go - v2
Criando operators para Kubernetes usando Go - v2
 
Angular 2, TypeScript e Além
Angular 2, TypeScript e AlémAngular 2, TypeScript e Além
Angular 2, TypeScript e Além
 
12 Factor App Docker na Cloud e outras buzzwords
12 Factor App Docker na Cloud e outras buzzwords12 Factor App Docker na Cloud e outras buzzwords
12 Factor App Docker na Cloud e outras buzzwords
 
JHipster - Produtividade e Maturidade em suas mãos
JHipster - Produtividade e Maturidade em suas mãosJHipster - Produtividade e Maturidade em suas mãos
JHipster - Produtividade e Maturidade em suas mãos
 
Vuejs Angularjs e Reactjs. Veja as diferenças de cada framework!
Vuejs Angularjs e Reactjs. Veja as diferenças de cada framework!Vuejs Angularjs e Reactjs. Veja as diferenças de cada framework!
Vuejs Angularjs e Reactjs. Veja as diferenças de cada framework!
 
Tutorial Dwr - Configuração e Uso
Tutorial Dwr - Configuração e UsoTutorial Dwr - Configuração e Uso
Tutorial Dwr - Configuração e Uso
 
Framework web 01 - Aula UTFPR 2018
Framework web 01 - Aula UTFPR 2018Framework web 01 - Aula UTFPR 2018
Framework web 01 - Aula UTFPR 2018
 
Começando com meteor
Começando com meteorComeçando com meteor
Começando com meteor
 

Injeção de dependências em Go com Wire

  • 1. INJEÇÃO DE DEPENDÊNCIAS CAMPINAS SP, NOV 25 2019 Tiago Angelo Software Engineer
  • 2. O que é Injeção de dependência? 01 Por quê? Containers de Injeção de Dependências Alternativas para Go Wire Let’s Code! 02 03 04 05 06
  • 3. WHOAMI Tiago Angelo Software Engineer ➔ microservices ➔ containers e service mesh ➔ Java ➔ Go
  • 4.
  • 5. { SEM INJEÇÃO DE DEPENDÊNCIAS a struct que verifica o clima é responsável por instanciar o logger e a que identifica a localização atual e 01. O QUE É INJEÇÃO DE DEPENDÊNCIA? // declarações de pacote e importações omitidas type Weather struct { log log.Logger locator location.Locator } func NewWeather() *Weather { log := log.NewZapLogger() locator := location.NewIPStack() return &Weather{log: log, locator: locator} } func (w *Weather) Check() string { w.log.Info("Checking the current weather") local := w.locator.WhereAmI() return w.CheckByCoord(local.Longitude, local.Latitude) } func (w *Weather) CheckByCoord(lat float64, lon float64) string { … } interfaces conhece as implementações dessas interfaces
  • 6. { COM INJEÇÃO DE DEPENDÊNCIAS o mesmo código usando DI 01. O QUE É INJEÇÃO DE DEPENDÊNCIA? // declarações de pacote e importações omitidas type Weather struct { log log.Logger locator location.Locator } func NewWeather(log log.Logger, locator location.Locator) *Weather { return &Weather{log: log, locator: locator} } func (w *Weather) Check() string { w.log.Info("Checking the current weather") local := w.locator.WhereAmI() return w.CheckByCoord(local.Longitude, local.Latitude) } func (w *Weather) CheckByCoord(lat float64, lon float64) string { … }
  • 7.
  • 8. INVERSÃO DE CONTROLE 02. POR QUÊ? Por quê? ● garantir o princípio de responsabilidade única. Como? ● movendo para outras classes quaisquer responsabilidades adicionais que uma classe possua, além de sua principal.
  • 9. INJEÇÃO DE DEPENDÊNCIAS 02. POR QUÊ? Por quê? ● implementar o princípio de inversão de controle; ● obter baixo acoplamento entre as classes. Como? ● movendo a criação do objeto de dependência para fora da classe e fornecendo esses objetos para ela.
  • 10.
  • 11.
  • 12. CONTAINERS DE INJEÇÃO DE DEPENDÊNCIAS ● também conhecidos como Containers de Inversão de Controle (IoC); ● fazem a ligação entre as abstrações e os tipos concretos que a implementam; ● sabe como instanciar as implementações; ● analisam os tipos de cada argumento do construtor e injeta as dependências nele.
  • 13. Exemplos 03. CONTAINERS DE INJEÇÃO DE DEPENDÊNCIAS ● Weld ● Spring ● Guice ● Salta ● Dagger
  • 14.
  • 15. Frameworks para Go 04. ALTERNATIVAS PARA GO ● Uber's Dig ● Facebook's Inject ● Google's Wire
  • 16.
  • 17. Wire 05. WIRE ● surgiu como parte do projeto Go Cloud; ● inspirado no Dagger 2 de Java; ● roda como um gerador de código e por isso opera sem uso de reflection; ● código gerado é legível.
  • 18. 1. Instalação 05. WIRE $ go get github.com/google/wire/cmd/wire ● no diretório da sua aplicação, execute:
  • 19. 2.1. Definindo Providers 05. WIRE // declarações de pacote e importações omitidas type Weather struct { log log.Logger locator location.Locator } func NewWeather(l log.Logger, ll location.Locator) *Weather { // Provider: normalmente são construtores return &Weather{log: l, locator: ll} } func (w *Weather) Check() string { w.log.Info("Checking the current weather") local, _ := w.locator.WhereAmI() return w.CheckByCoord(local.Longitude, local.Latitude) } func (w *Weather) CheckByCoord(lat float64, lon float64) string { ... }
  • 20. 2.2. Definindo Providers 05. WIRE package log import ( "go.uber.org/zap" defaultLogger "log" ) func NewSugaredLogger() *zap.SugaredLogger { // Provider: uma função capaz de produzir um valor logger, err := zap.NewDevelopment() if err != nil { defaultLogger.Fatal(err) } log := logger.Sugar() log.Debug("criando nova instância de SugaredLogger da biblioteca Zap") return log }
  • 21. 2.3. Definindo Providers 05. WIRE package log import ( "github.com/google/wire" ) var Providers = wire.NewSet( // Providers podem ser agrupados NewSugaredLogger, NewZapLogger, wire.Bind(new(Logger), new(*ZapLogger)), )
  • 22. 3. Definindo o Injector 05. WIRE //+build wireinject - essa tag garante que esse arquivo não seja incluído na build final. package main import ( "github.com/angelokurtis/golang-meetup/internal/http" "github.com/angelokurtis/golang-meetup/internal/log" "github.com/angelokurtis/golang-meetup/pkg/forecast" "github.com/angelokurtis/golang-meetup/pkg/location" "github.com/google/wire" ) func Initialize() *Weather { wire.Build(http.Providers, log.Providers, forecast.Providers, location.Providers) return &Weather{} }
  • 23. 4. Gerar o Injector 05. WIRE $ wire ● no diretório da sua aplicação, execute: o resultado será salvo em um arquivo chamado wire_gen.go
  • 24.