LoginSignup
0
1

More than 3 years have passed since last update.

【Go】依存性注入ライブラリwireの使い方【DI】

Posted at

Hello, World

DI とは

Weblio辞書から引用
DIとは、プログラミングにおけるデザインパターン(設計思想)の一種で、オブジェクトを成立させるために必要となるコードを実行時に注入(Inject)してゆくという概念のこと

現在Go言語でクリーンアーキテクチャを使用して開発をしているのですが、、依存関係のメソッドを呼び出すのにwireを利用したのでメモしておきます。

wireの使い方

ターミナル
go get github.com/google/wire/cmd/wire

プロジェクトにdiディレクトリを作成し、その中にwire.goを作成して以下を記述します。

wire.go
// +build wireinject

package di

func InitReview() handler.Review {
    wire.Build(
         db.New,
         repository.NewReview,
         usecase.NewReview,
         handler.NewReview,
    )
    return nil //明示的にnilを返す
}

このwire.Buildのカッコ内に依存関係を解決するメソッドを全て(順不同)入れます。
クリーンアーキテクチャを採用している場合だと例えばrepositoryはDBの値を実際に操作するパッケージ(一番外側のinfra層になる)としていますが、これをusecaseで呼び出すときに外側のinfra層からは呼び出せないので、usecase層よりも内側で空のインターフェースの中の関数を呼び出しています。その依存関係を解決して実際のinfraの関数をdiを使って呼び出しています。

このコードをもとに、実際に使うメソッドを生成するコマンドを打ちます。

ターミナル
wire ./di/wire.go
wire_gen.go
func InitReview() handler.Review {
    conn := db.New()
    review := repository.NewReview(conn)
    usecaseReview := usecase.NewReview(review)
    handlerReview := handler.NewReview(usecaseReview)
    return handlerReview

こんな感じの関数が生成されたら成功です。あとは実際にこの関数をhandlerで呼び出してあげれば全て使用することができます。お疲れ様でした。

すごくざっくり書いたので質問や訂正あればコメントお願いします。以上です。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1