Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introducing Wire: Dependency Injection by Code Generator

Introducing Wire: Dependency Injection by Code Generator

Yosuke Ishikawa

December 18, 2018
Tweet

More Decks by Yosuke Ishikawa

Other Decks in Technology

Transcript

  1. JTILBXB
    8JSF
    ίʔυੜ੒ʹΑΔ%*

    View Slide

  2. View Slide

  3. View Slide

  4. %*

    View Slide

  5. %FQFOEFODZ*OKFDUJPO

    View Slide

  6. package json
    func NewDecoder(r io.Reader) *Decoder {
    return &Decoder{r: r}
    }

    View Slide

  7. io.Reader
    json.Decoder

    View Slide

  8. Bookshelf
    Service
    BookRepository
    BookOwnership
    Repository
    Notification
    Repository
    Inbox
    Service
    UserRepository
    API
    Server
    Job A
    Job B
    Datastore
    Client

    View Slide

  9. func main() {
    ctx := context.Background()
    client, err := datastore.NewClient(ctx, "my-project")
    if err != nil {
    log.Fatal(err)
    }
    defer client.Close()
    bookRepository := NewBookRepository(client)
    bookOwnershipRepository := NewBookOwnershipRepository(client)
    userRepository := NewUserRepository(client)
    notificationRepository := NewNotificationRepository(client)
    bookshelfService := NewBookshelfService(bookRepository, bookOwnershipRepository,
    inboxService := NewInboxService(userRepository, notificationRepository)
    server := NewAPIServer(bookshelfService, inboxService)
    server.Listen()
    }

    View Slide

  10. Shopping
    Service
    BookRepository
    BookOwnership
    Repository
    Notification
    Repository
    Inbox
    Service
    UserRepository
    Admin
    Server
    Job A
    Job B
    PubSub
    Client
    Bookshelf
    Service
    BookRepository
    BookOwnership
    Repository
    Notification
    Repository
    Inbox
    Service
    UserRepository
    API
    Server
    Job A
    Job B
    Datastore
    Client
    Bookshelf
    Service
    BookRepository
    BookOwnership
    Repository
    Notification
    Repository
    Inbox
    Service
    UserRepository
    API
    Server
    Job A
    Job B
    Datastore
    Client
    Bookshelf
    Service
    BookRepository
    BookOwnership
    Repository
    Notification
    Repository
    Inbox
    Service
    UserRepository
    API
    Server
    Job A
    Job B
    Datastore
    Client
    Bookshelf
    Service
    BookRepository
    BookOwnership
    Repository
    Notification
    Repository
    Inbox
    Service
    UserRepository
    API
    Server
    Job A
    Job B
    Datastore
    Client
    Bookshelf
    Service
    BookRepository
    BookOwnership
    Repository
    Notification
    Repository
    Inbox
    Service
    UserRepository
    API
    Server
    Job A
    Job B
    Datastore
    Client
    Bookshelf
    Service
    BookRepository
    BookOwnership
    Repository
    Notification
    Repository
    Inbox
    Service
    UserRepository
    API
    Server
    Job A
    Job B
    Datastore
    Client
    Recommend
    Service
    BookRepository
    BookOwnership
    Repository
    Notification
    Repository
    Inbox
    Service
    UserRepository
    Job C
    Job D
    Functions
    Client
    Bookshelf
    Service
    BookRepository
    BookOwnership
    Repository
    Notification
    Repository
    Inbox
    Service
    UserRepository
    API
    Server
    Job A
    Job B
    Datastore
    Client
    Bookshelf
    Service
    BookRepository
    BookOwnership
    Repository
    Notification
    Repository
    Inbox
    Service
    UserRepository
    API
    Server
    Job A
    Job B
    Datastore
    Client
    Bookshelf
    Service
    BookRepository
    BookOwnership
    Repository
    ReadHistory
    Repository
    History
    Service
    UserRepository
    API
    Server
    Job A
    Job B
    Datastore
    Client

    View Slide

  11. notificationRepository := NewNotificationRepository()
    bookshelfService := NewBookshelfService(
    bookRepository,
    bookOwnershipRepository,
    userRepository)
    inboxService := NewInboxService(
    userRepository,
    notificationRepository)
    bookRepository := NewBookRepository()
    bookOwnershipRepository := NewBookOwnershipRepository()
    userRepository := NewUserRepository()
    notificationRepository := NewNotificationRepository()
    bookshelfService := NewBookshelfService(
    bookRepository,
    bookOwnershipRepository,
    userRepository)
    inboxService := NewInboxService(
    userRepository,
    notificationRepository)
    bookRepository := NewBookRepository()
    bookOwnershipRepository := NewBookOwnershipRepository()
    userRepository := NewUserRepository()
    notificationRepository := NewNotificationRepository()
    bookshelfService := NewBookshelfService(
    bookRepository,
    bookOwnershipRepository,
    userRepository)
    inboxService := NewInboxService(
    userRepository,
    notificationRepository)
    bookRepository := NewBookRepository()
    bookOwnershipRepository := NewBookOwnershipRepository()
    userRepository := NewUserRepository()
    notificationRepository := NewNotificationRepository()
    bookshelfService := NewBookshelfService(
    bookRepository,
    bookOwnershipRepository,
    userRepository)
    inboxService := NewInboxService(
    userRepository,
    notificationRepository)
    bookRepository := NewBookRepository()
    bookOwnershipRepository := NewBookOwnershipRepository()
    userRepository := NewUserRepository()
    notificationRepository := NewNotificationRepository()
    bookshelfService := NewBookshelfService(
    bookRepository,
    bookOwnershipRepository,
    userRepository)
    inboxService := NewInboxService(
    userRepository,
    notificationRepository)
    bookRepository := NewBookRepository()
    bookOwnershipRepository := NewBookOwnershipRepository()
    userRepository := NewUserRepository()
    notificationRepository := NewNotificationRepository()
    bookshelfService := NewBookshelfService(
    bookRepository,
    bookOwnershipRepository,
    userRepository)
    inboxService := NewInboxService(
    userRepository,
    notificationRepository)
    bookRepository := NewBookRepository()
    bookOwnershipRepository := NewBookOwnershipRepository()
    userRepository := NewUserRepository()
    notificationRepository := NewNotificationRepository()
    bookshelfService := NewBookshelfService(
    bookRepository,
    bookOwnershipRepository,
    userRepository)
    inboxService := NewInboxService(

    View Slide

  12. View Slide

  13. 8JSF

    View Slide

  14. View Slide

  15. %*ʹඞཁͳίʔυ

    View Slide

  16. %*ʹඞཁͳίʔυ
    ຊ࣭ ࣗ໌

    View Slide

  17. %*ʹඞཁͳίʔυ
    ͜͜Λࣗಈੜ੒
    ຊ࣭ ࣗ໌

    View Slide

  18. ຊ࣭ͱ͸

    View Slide

  19. w ͲͷΑ͏ͳґଘ͕͋Δͷ͔
    w Ͳ͏΍ͬͯґଘΛऔಘ͢Δͷ͔

    View Slide

  20. w 1SPWJEFS
    w *OKFDUPS

    View Slide

  21. 1SPWJEFS

    View Slide

  22. func NewBookRepository(client *datastore.Client) BookRepository {
    ...
    }

    View Slide

  23. Bookshelf
    Service
    BookRepository
    BookOwnership
    Repository
    Notification
    Repository
    Inbox
    Service
    UserRepository
    API
    Server
    Job A
    Job B
    Datastore
    Client
    1SPWJEFS

    View Slide

  24. Bookshelf
    Service
    BookRepository
    BookOwnership
    Repository
    Notification
    Repository
    Inbox
    Service
    UserRepository
    API
    Server
    Job A
    Job B
    Datastore
    Client
    1SPWJEFS

    View Slide

  25. Bookshelf
    Service
    BookRepository
    BookOwnership
    Repository
    Notification
    Repository
    Inbox
    Service
    UserRepository
    API
    Server
    Job A
    Job B
    Datastore
    Client
    1SPWJEFS

    View Slide

  26. Bookshelf
    Service
    BookRepository
    BookOwnership
    Repository
    Notification
    Repository
    Inbox
    Service
    UserRepository
    API
    Server
    Job A
    Job B
    Datastore
    Client
    1SPWJEFS

    View Slide

  27. *OKFDUPS

    View Slide

  28. // +build wireinject
    ...
    func InitializeServer(
    ctx context.Context,
    projectID ProjectID) (server *Server, cleanup func(), err error) {
    wire.Build(
    ProvideDatastoreClient,
    NewBookRepository,
    NewBookOwnershipRepository,
    NewUserRepository,
    NewNotificationRepository,
    NewBookshelfService,
    NewInboxService,
    NewAPIServer)
    return
    }

    View Slide

  29. $ wire ./...

    View Slide

  30. //+build !wireinject
    ...
    func InitializeServer(
    ctx context.Context, projectID ProjectID) (*Server, func(), error) {
    client, cleanup, err := ProvideDatastoreClient(ctx, projectID)
    if err != nil {
    return nil, nil, err
    }
    bookRepository := NewBookRepository(client)
    bookOwnershipRepository := NewBookOwnershipRepository(client)
    userRepository := NewUserRepository(client)
    notificationRepository := NewNotificationRepository(client)
    bookshelfService := NewBookshelfService(bookRepository, bookOwnershipRepository,
    inboxService := NewInboxService(userRepository, notificationRepository)
    server := NewAPIServer(bookshelfService, inboxService)
    return server, func() {
    cleanup()
    }, nil
    }

    View Slide

  31. //+build !wireinject
    ...
    func InitializeServer(
    ctx context.Context, projectID ProjectID) (*Server, func(), error) {
    client, cleanup, err := ProvideDatastoreClient(ctx, projectID)
    if err != nil {
    return nil, nil, err
    }
    bookRepository := NewBookRepository(client)
    bookOwnershipRepository := NewBookOwnershipRepository(client)
    userRepository := NewUserRepository(client)
    notificationRepository := NewNotificationRepository(client)
    bookshelfService := NewBookshelfService(bookRepository, bookOwnershipRepository,
    inboxService := NewInboxService(userRepository, notificationRepository)
    server := NewAPIServer(bookshelfService, inboxService)
    return server, func() {
    cleanup()
    }, nil
    }
    ैདྷखॻ͖͍ͯͨ͠
    ίʔυ͕ࣗಈੜ੒͞Εͨ

    View Slide

  32. View Slide

  33. ࣮͸͜ΕΒ΋ࣗಈੜ੒Ͱ͖Δ
    w ύϥϝʔλʔͷड͚౉͠
    w Τϥʔॲཧ
    w ΫϦʔϯΞοϓॲཧ

    View Slide

  34. ָͳ͚ͩͰ͸ͳ͍

    View Slide

  35. ίʔυੜ੒ʹΑΔґଘؔ܎ͷղܾͳͷͰ
    άϥϑͷܽଛΛίϯύΠϧ࣌ʹൃݟͰ͖Δ

    View Slide

  36. ·ͱΊ

    View Slide

  37. w 8JSF͸%*ͷࣗ໌ͳίʔυΛࣗಈੜ੒͢Δπʔϧ
    w ґଘؔ܎͸ίϯύΠϧ࣌ʹղܾ͞ΕΔͷͰ҆શ

    View Slide

  38. IUUQTHJUIVCDPNHPPHMFXJSF

    View Slide