GoのWeb系側に全然触れていなかったので、fxというツールを使いつつ、ちょっと学んでみた。。 ちなみにこのライブラリはどういうものかというと、DIできるやつです。

Uber製らしい。物凄くディスカッションがUber社内みがある?感じがする笑

ASP.NETはDIがガシガシ使えるので、そういうものを使えないかということでちょっと触ってみた。まだあんまり分からないのですが。

更に一応解説すると、DIはクラス(Goだと構造体や普通の関数の引数)コンストラクタを定義しとけば、その引数に登録した型と一致するファクトリがあれば、それを勝手に突っ込んでくれるようになるコンテナ、というかもはやアプリです。

Goではwireというのがスター多かったのですが、コード生成系はちょっと覚えるのが…(Goだとでもそういうの多いんですよね)。ということでリフレクションでやるこちらはちょっとお気楽感があって良い。

例えばこんな感じにルーティングを設定するやつを持っといて

var RouteProvider = fx.Options(
	fx.Provide(
		fx.Annotate(
			NewRouteManager,
			fx.ParamTags(GROUP_TAG),
		),
	),
	fx.Invoke(func(manager *RouteManager, s *server.EchoServer) {
		manager.ConfigureRoute(s.Server())
	}),
)

アプリフォルダではこんな感じにしておく

var TodoRouteProvider = fx.Provide(
	fx.Annotate(
		NewTodoRoute,
		fx.As(new(route.Route)),
		fx.ResultTags(route.GROUP_TAG),
	),
)

type TodoRoute struct {
	controller *controller.TodoController
}

func NewTodoRoute(controller *controller.TodoController) *TodoRoute {
	return &TodoRoute{controller: controller}
}

func (r *TodoRoute) ConfigureRoute(e *echo.Echo) {
	todo := e.Group("/todo")
	todo.GET("", r.controller.Index)
	todo.GET("/:id", r.controller.Show)
	todo.POST("", r.controller.Create)
	todo.PATCH("/:id", r.controller.Update)
	todo.DELETE("/:id", r.controller.Delete)
}

var RoutesModule = fx.Options(
	TodoRouteProvider,
)

すると、例えばTodoとかNoteとか色んなルーターに小分けして、Todoだけ外したいとかなったらコメントアウトすれば外す、みたいなことができるようになる。

要はファイル単位とかで「使う材料」を剥がしたり付け替えたり、みたいなことができるようになる。

で、以下のリポジトリは実際にはentってやつのクライアントを使っている(詳しい中身はわからないが、つまるところORMです)。 これも例えばent用とかsqlドライバ用みたいなのとか、色々持ってしまっている場合、それぞれのリポジトリはインターフェースで合ってさえいれば、すり替えができる算段ではある。

var TodoRepsitoryProvider = fx.Provide(
	fx.Annotate(
		NewTodoRepository,
		fx.As(new(repository.TodoRepository)),
	),
)

type TodoRepository struct {
	ctx context.Context
	db  *database.EntDb
}

ということで、長時間かかった。。

あまりに実験的で雑度がすぎるので偉いアレですがGitHubで一応パブリックにしておいたので、何かみたいものがあればどうぞ。