DIツールとしてdigを導入した

0

2022年05月09日 13:00

こんにちはISSUEの寒河江です。

バックエンド側の実装が肥大化してきたので、DI管理ツールのdigを利用することにしました。以前はgoogle製のwireを使っていたのですが、今回は流行っているということもあり、digを採用してみました。詳細な比較記事は後ほど書いてみようと思います。

digは何をしてくれているか

digはDI情報を保持するcontainerを管理してくれます。今まではベタがきで実装していたDI処理を簡単に管理することができます。すごく簡単にいうと

  • Provideで依存関係をセット
  • InvokeでDIオブジェクトの取得

というイメージになります。

全体の実装イメージ

クリーンアーキテクチャで実装しており、Controller、Interactor、Repositoryにそれぞれ依存性を注入します。
img
routerの作成処理です。
img

コントローラの生成処理です。
img

処理順序は
①DIされたcontainer情報を作成
②containerからDI情報をInvokeで呼び出す
③routerに呼び出すhandlerを設定する

です。

1つずつの処理を見ていきます。

①DIされたcontainer情報を作成

NewContainerでDIコンテナを作成しています。
img

NewContainerではProvideで依存関係をセットしています。
img
ポイントはProvideの引数のNewBookRepositoryNewBookInteractorNewBookControllerに引数が設定されていないところです。一度ProvideでDIオブジェクトが設定されていればはdigが自動で引数の値を推測してくれます。

NewBookControllerのProvideを省略しない場合下記のようになります。
img
img

②containerからDI情報をInvokeで呼び出す

Invokeを使うとcontainerに登録した、情報を呼び出すことができます。呼び出した情報はInvokeのスコープ内でのみ利用できます。
img

dig.Inとdig.OutでInvokeで利用しやすい情報を取得する

dig.Outを埋め込んだ構造体ControllerResultの情報は、dig.Inを埋め込んだ構造体ControllerParamsから取得することができます。
img

Controller情報をInvokeの中で取得したいのでControllerResultにControllerをセットします。
img

Invoke内でControllerParamsを取得することでbookControllerがDIされたControllerを取得できます
img

③routerに呼び出すControllerを設定する

最後にルーティングにcontroller関数を設定します。引数で渡された*controller.ControllerからDIされたBookControllerを呼び出し、List関数を呼び出しています。
img

これで完了です!ポイントはdig.Indig.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

# Go
# Firebase
0

診断を受けるとあなたの現在の業務委託単価を算出します。今後副業やフリーランスで単価を交渉する際の参考になります。また次の単価レンジに到達するためのヒントも確認できます。

目次を見る