DIコンテナを使わないDI / golang.tokyo#11
by
morikuni
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
DIίϯςφΛΘͳ͍DI golang.tokyo#11 2017/12/11
Slide 2
Slide 2 text
ࣗݾհ • Name: ᅳ ହฏ (Morikuni Taihei) • GitHub: @morikuni • Twi9er: @inukirom • ॴଐ • גࣜձࣾϝϧΧϦ/ικ • ϝϧΧϦ Χϧ
Slide 3
Slide 3 text
ຊͷ༰ ❌ DIͰ͖ΔΑ͏ʹίʔυΛॻ͘ํ๏ ⭕ DIίϯςφΛΘͣʹґଘؔΛղܾ͢Δํ๏
Slide 4
Slide 4 text
Ͳ͏ͬͯґଘؔΛղܾ͢Δʁ • mainʹॻ͘ • DIίϯςφΛ͏ • DI༻ͷؔΛఆٛ͢Δ
Slide 5
Slide 5 text
ྫ ҎԼͷ3ͭͷؔΛͬͯServiceͷΠϯελϯεΛ࡞Εɻ func NewService(repo Repository, mailer Mailer) Service { ... } func NewRepository(db *sql.DB) Repository { ... } func NewMailer() Mailer { ... } ServiceRepositoryͱMailerʹґଘ͍ͯ͠Δɻ Repository*sql.DBʹґଘ͍ͯ͠Δɻ
Slide 6
Slide 6 text
mainʹॻ͘ func main() { db, err := sql.Open("db", "dsn") if err != nil { ... } repo := NewRepository(db) mailer := NewMailer() service := NewService(repo, mailer) } ΦϒδΣΫτ͕૿͑Δʹmain͕ංେԽ͍͖ͯ͠Մಡੑ͕͍
Slide 7
Slide 7 text
DIίϯςφΛ͏ (goldi*1) • yamlʹґଘؔΛهड़͢Δ • DIίϯςφ༻ͷίʔυΛੜ͢Δ • DIίϯςφ͔ΒඞཁͳΠϯελϯεΛऔಘ͢Δ DIίϯςφͷ͍ํΛ֮͑Δඞཁ͕͋Δ *1 ࣮ࡍʹgoldiΛͬͨ͜ͱͳ͍ͷͰؒҧ͍ͬͯΔՄೳੑ͕͋Γ·͢
Slide 8
Slide 8 text
types: db: package: database/sql type: *DB factory: Open arguments: - "db" - "dsn" repository: package: github.com/morikuni/hoge type: Repository factory: NewRepository arguments: - "@db" mailer: package: github.com/morikuni/hoge type: Mailer factory: NewMailer service: package: github.com/morikuni/hoge type: Service factory: NewService arguments: - "@repository" - "@mailer"
Slide 9
Slide 9 text
DI༻ͷؔΛఆٛ͢Δ(Injectؔ) • ΦϒδΣΫτ͕Ҿ0ݸͰऔಘͰ͖ΔΑ͏ʹ͢Δؔ • ͋ΔΦϒδΣΫτʹ͍ͭͯɺґଘઌ͕Ҿ0ݸͰऔಘͰ͖Εͦ ͷΦϒδΣΫτҾ0ݸͰऔಘͰ͖Δ • InjectؔΛΈ߹ΘͤΔ͜ͱͰInjectؔΛ࡞Δ
Slide 10
Slide 10 text
Injectؔͷ࣮ InjectDB*sql.DB͕Ҿ0ݸͰऔಘͰ͖ΔΑ͏ʹ͢Δ func InjectDB() *sql.DB { db, err := sql.Open("db", "dsn") if err != nil { panic(err) } return db }
Slide 11
Slide 11 text
Injectؔͷ࣮ *sql.DB͕Ҿ0ݸͰऔಘͰ͖ΔͷͰRepositoryҾ0ݸͰऔಘͰ͖Δ func InjectRepository() Repository { return NewRepository( InjectDB(), ) } func InjectMailer() Mailer { return NewMailer() }
Slide 12
Slide 12 text
Injectؔͷ࣮ RepositoryͱMailer͕Ҿ0ݸͰऔಘͰ͖ΔͷͰɺService Ҿ0ݸͰऔಘͰ͖ΔΑ͏ʹͳΔ func InjectService() Service { return NewService( InjectRepository(), InjectMailer(), ) }
Slide 13
Slide 13 text
InjectؔΛ͏ར • ґଘઌ͕૿ݮͨ͠ͱͯ͠ӨڹൣғInjectؔʹऩ·Δ • ࣮͕ॻ͔ΕΔpackage͕มΘͬͯӨڹൣғInjectؔʹ ऩ·Δ • GoͷίʔυͰॻ͚ΔͷͰߏจΛ৽֮͑͘͠Δඞཁ͕ͳ͍
Slide 14
Slide 14 text
ৄ͘͠WebͰʂ ໌(12/12)ͷQiita Advent Calender Go4ʹ ͏গ͠ৄ͍͠هࣄΛॻ͖·͢ʂ h"ps:/ /qiita.com/advent-calendar/2017/go4