Как избежать круговых зависимостей, но сохранить чистую структуру - PullRequest
3 голосов
/ 25 мая 2020

У меня такая структура:

httpservice
L endpointHandler.go (it has as parameters databaseA and databaseB)
L types.gen.go (autogenerated from the api definition)

storage
L databaseA.go (each database has 'Store(Type)' and 'Get() -> Type' functions)
L databaseB.go

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

Есть ли способ решить эту проблему с помощью интерфейсов? Я попробовал, но не избавился от круговых проблем. Некоторые решения, о которых я мог подумать:

  1. Скопируйте и вставьте типы в пакет хранилища и игнорируйте сгенерированные типы

  2. Переместите базы данных внутри httpservice package и забудьте о красивой структуре папок.

PD: Есть много вопросов о циклических зависимостях, но мне не удается решить мою конкретную проблему. Извините, если это повторяется.

1 Ответ

0 голосов
/ 25 мая 2020

Если приложение растет - вы можете рассмотреть возможность использования концепции архитектуры «порты и адаптеры», чтобы инвертировать зависимость.

В этом случае вам не нужна зависимость от «httpservice» к низкоуровневому хранилищу "пакет. (Httpservice, вероятно, действующий как интерфейс для внешнего доступа, не должен знать технических деталей хранилища. Фактически хранилище может быть чем-то другим в будущем в любом случае). Таким образом, вы можете определить интерфейс на уровне (пакете) «httpservice», который имеет значение для этого уровня (например, «mydataService interface {}») - это я назвал вторичным портом.

Уровень «хранилища» может знать "httpservice" и реализует адаптер (реализующий определенный интерфейс)

При инициализации вашего приложения убедитесь, что вы вставили правильный адаптер хранилища в httpservice.

Некоторые более крупные структуры также используют этот подход - вы можете прочитать больше: https://docs.flamingo.me/2.%20Flamingo%20Core/1.%20Flamingo%20Basics/4.%20Ports%20and%20Adapters.html

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