DIツールとしてdigを導入した
2022年05月09日 13:00
こんにちはISSUEの寒河江です。
バックエンド側の実装が肥大化してきたので、DI管理ツールのdigを利用することにしました。以前はgoogle製のwireを使っていたのですが、今回は流行っているということもあり、digを採用してみました。詳細な比較記事は後ほど書いてみようと思います。
digはDI情報を保持するcontainerを管理してくれます。今まではベタがきで実装していたDI処理を簡単に管理することができます。すごく簡単にいうと
というイメージになります。
クリーンアーキテクチャで実装しており、Controller、Interactor、Repositoryにそれぞれ依存性を注入します。
routerの作成処理です。
コントローラの生成処理です。
処理順序は
①DIされたcontainer情報を作成
②containerからDI情報をInvokeで呼び出す
③routerに呼び出すhandlerを設定する
です。
1つずつの処理を見ていきます。
NewContainer
でDIコンテナを作成しています。
NewContainer
ではProvideで依存関係をセットしています。
ポイントはProvideの引数のNewBookRepository
、NewBookInteractor
、NewBookController
に引数が設定されていないところです。一度ProvideでDIオブジェクトが設定されていればはdigが自動で引数の値を推測してくれます。
NewBookControllerのProvideを省略しない場合下記のようになります。
Invokeを使うとcontainerに登録した、情報を呼び出すことができます。呼び出した情報はInvokeのスコープ内でのみ利用できます。
dig.Out
を埋め込んだ構造体ControllerResult
の情報は、dig.In
を埋め込んだ構造体ControllerParams
から取得することができます。
Controller
情報をInvokeの中で取得したいのでControllerResult
にControllerをセットします。
Invoke内でControllerParamsを取得することでbookControllerがDIされたControllerを取得できます
最後にルーティングにcontroller関数を設定します。引数で渡された*controller.Controller
からDIされたBookController
を呼び出し、List関数を呼び出しています。
これで完了です!ポイントはdig.In
とdig.Out
を利用することでサーバー起動時の処理を綺麗にかけるところだと思いました。wireだとこの辺の設定はどうなっているんだろうか...
また今後digの応用的な使い方、wireとの比較について書いてみようと思います。
ご一読ありがとうございました!
https://github.com/uber-go/dig
Golang dependency injection: dig
GoのおすすめDIツール
https://pkg.go.dev/go.uber.org/dig#section-readme
診断を受けるとあなたの現在の業務委託単価を算出します。今後副業やフリーランスで単価を交渉する際の参考になります。また次の単価レンジに到達するためのヒントも確認できます。
目次を見る