Google / Wire: это вариант использования для шаблона Singleton? - PullRequest
0 голосов
/ 03 марта 2019

Следующий фрагмент объявляет два инициализатора Google / Wire, которые имеют общую зависимость.Каков наилучший способ обеспечить создание только одного экземпляра конфигурации?

Я мог бы передать разделяемую зависимость в функцию InitializeStorageHandler, но это нарушило бы цель DI, если мое понимание верно.

Конечно, я мог бы также использовать шаблон Singleton.Я не уверен, что это «путь» в делах.Есть ли лучшая практика?

package api

import (
    "../storage"
    "../config"
    "github.com/google/wire"
)

func InitializeServer() (*Server, error) {
    panic(wire.Build(config.NewConfiguration, NewServer))
}

func InitializeStorageHandler() *StorageHandler {
    panic(wire.Build(config.NewConfiguration, storage.NewStorage, storage.NewService, NewStorageHandler))
}

1 Ответ

0 голосов
/ 17 марта 2019

Конечно, я мог бы также использовать шаблон Singleton

Это будет соответствовать проводу, как в выпуск 77 , в котором упоминается, что "Провод очень"Предназначен для предоставления синглетонов".

Как обсуждено в выпуске 21 :

В проводнике намеренно нет понятия подкомпонентов на данный момент.
В разговоре с командой Dagger мы обнаружили, что подкомпоненты и области видимости вносят существенную сложность.

Как вы говорите, вы можете получить то же самое поведение, возвращая синглтоны от первого инжектора, который их создает, и затем передает их более поздним инжекторам .Это имеет то преимущество, что делает поток данных явным, что для примеров, которые мы придумали, казалось чистым выигрышем.
Тем не менее, нам очень любопытно посмотреть, как люди будут использовать Wire в реальных приложениях: еслиэто не масштабируется, возможно, нам придется вернуться к нему.

Я понял после более внимательного изучения вашего образца , что сам компонент находится в состоянии (деталь, которую я забыл о Dagger).Мое объяснение, приведенное выше, все еще в значительной степени применимо: мы хотим, чтобы состояние было явным.

В этом случае, посмотрите " Как шаблон синглтона работает с Golang " от Джефферсон ОтониLima : sync.Once или функция init() могут помочь в создании единого целого с безопасностью, "в пути".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...