DIコンテナを使わないDI / golang.tokyo#11
by
morikuni
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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