64 lines
2.2 KiB
Go
64 lines
2.2 KiB
Go
package app
|
||
|
||
import (
|
||
"log/slog"
|
||
"net/http"
|
||
|
||
"github.com/olezhek28/di-demo/internal/config"
|
||
)
|
||
|
||
// App — структура приложения.
|
||
// Содержит DI-контейнер и HTTP-сервер.
|
||
// API-слой отвечает за хендлеры и роутинг, а http.Server живёт здесь —
|
||
// это инфраструктура, а не бизнес-логика.
|
||
type App struct {
|
||
diContainer *diContainer
|
||
httpServer *http.Server
|
||
}
|
||
|
||
// New создаёт приложение и инициализирует все зависимости через DI-контейнер.
|
||
// Вся цепочка зависимостей разрешается здесь: от базы данных до HTTP-хендлеров.
|
||
// Если какая-то зависимость не создалась — процесс завершится внутри контейнера.
|
||
func New() *App {
|
||
a := &App{
|
||
diContainer: newDIContainer(),
|
||
}
|
||
|
||
a.initDeps()
|
||
|
||
return a
|
||
}
|
||
|
||
// initDeps последовательно вызывает функции инициализации.
|
||
// Если нужно добавить новый шаг (миграции, метрики и т.д.) —
|
||
// просто добавить функцию в слайс inits.
|
||
func (a *App) initDeps() {
|
||
inits := []func(){
|
||
a.initHTTPServer,
|
||
}
|
||
|
||
for _, fn := range inits {
|
||
fn()
|
||
}
|
||
}
|
||
|
||
// initHTTPServer создаёт HTTP-сервер.
|
||
// API-слой (Handler) предоставляет только роутинг — Routes().
|
||
// А http.Server с адресом и конфигом создаётся здесь, в app-слое.
|
||
func (a *App) initHTTPServer() {
|
||
a.httpServer = &http.Server{
|
||
Addr: config.AppConfig().HTTPAddr,
|
||
Handler: a.diContainer.Handler().Routes(),
|
||
}
|
||
}
|
||
|
||
// Run запускает HTTP-сервер.
|
||
//
|
||
// Сейчас просто запускаем и всё. Перехват сигналов, graceful shutdown,
|
||
// закрытие ресурсов в правильном порядке — тема отдельного видео.
|
||
func (a *App) Run() error {
|
||
slog.Info("сервер запущен", "addr", config.AppConfig().HTTPAddr)
|
||
|
||
return a.httpServer.ListenAndServe()
|
||
}
|