Summary


依存性注入では、依存を外から注入することで依存構造、責任を明示的にできる。

Firebase Authentication, GORMを用いた実装例


type AuthHandler struct {
	DB           *gorm.DB
	FirebaseAuth *firebase.Client
}

func NewAuthHandler(db *gorm.DB, firebaseAuthClient *firebase.Client) *AuthHandler {
	return &AuthHandler{DB: db, FirebaseAuth: firebaseAuthClient}
}

これらの依存は Handler 側に持たせ、Router 側で注入する。

ルーターの依存方向が外部ライブラリに直接向いてしまう設計は避けるべき。
実装レイヤーが外部に依存すべきで、ルーターはその実装に依存すれば良い。
依存性注入により責任は分離され、Router は構造や初期化処理を持たず、「ルーティング設定」という責務に集中できる。

関心の分離:
コンポーネントは、自分の「主たる責任」のみに集中し、
依存の初期化や構成といった「副次的責任」から開放されるべき。

結論


ルーターやサービスは、外部依存を使う構造体を注入するだけで、責任は持たない。
この設計が、保守性・可読性を飛躍的に高める。