Я решил написать каркас чистой архитектуры, который бы использовал в дальнейшем в своих pet-project. Я опирался на принятые сообществом Golang
правила .
Так вот ближе к вопросу, на данный момент у меня архитектура примерно такова:
├── internal
│ ├── users/v1
│ │ ├── service
│ │ ├── repository
│ │ │ ├── postgresql
│ │ │ │ ├── postgresql.go
│ │ │ ├── redis
│ │ │ │ ├── redis.go
│ │ └── handler
(Лишнее я не стал писать, лучше сосредоточимся на проблеме)
В файлах
postgresql.go и
redis.go находятся интерфейсы, структуры и функция(Adapter), которая возвращает interface
codepackage postgresql
type PostgreSQL interface {
Test()
}
type postgreSQLRepository struct {
}
func NewPostgreSQL() PostgreSQL {
return &postgreSQLRepository{}
}
func (r *postgreSQLRepository) Test() {}
Инициализация баз данных будет примерно такая:
codeuserPostgresql := postgresql.NewPostgreSQL
userRedis := redis.NewRedis
и дальше таких инициализаций будет еще больше,
эту проблему я решил, добавив в repository файл repository.go с таким кодом
codepackage repository
func NewRedis() redis.Redis {
return redis.NewRedis()
}
func NewPostgreSQL() postgresql.PostgreSQL {
return postgresql.NewPostgreSQL()
}
и теперь инициализация в главном файле выглядит куда красивее:
codefunc main() {
repository.NewPostgreSQL()
repository.NewRedis()
}
Теперь вопрос:
Правильно ли я сделал или я слишком усложнил код? Конечно, я находил решение, просто кидать файлы postgresql,go, redis.go в repository, но мне такой исход не понравился, потому что там еще будут тесты и все перемешается.
Я надеюсь на открытый ответ и если у вас есть решение по проще, рад был бы выслушать вас.