GraphQL と CQRS

C# で GraphQL.NET を使って GraphQL API のサンプルをいくつか書いてみたわけだけど、 クエリのリゾルバは Entity Framework Core の DbContext を使ってデータを取得するように実装するのが、開発効率考えると現状一番良さそう。クエリはネストできるし、その時 N+1 問題対策で DataLoader を使うことになるだろうから、規模が大きくなってきても DbContext 直のままで行けそうだ。

一方でミューテーションのリゾルバでは、サンプル程度ならこちらも DbContext を直に使って登録や更新をすればいい。ただ、こちらは規模が大きくなってくると DbContext だけではツラくなる。 参照と違って登録や更新はドメインロジックが入ってくるから、ユースケースを実装してリゾルバから呼び出す形になっていきそう。

…って書いていて思ったんだけど、これってコマンドクエリ責務分離(CQRS)だよな。 クエリは DbContext (というか IQueryable)に対し、ミュテーションではユースケース。ミューテーションはコマンドに相当するわけだ。 CQRS 脳になって、クエリスタックとコマンドスタックに分けて考えて実装するといいのかもしれない。