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 { ... } Service͸Repositoryͱ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