3月第3週の振り返り

3月第3週(3/9-3/15)

ASP.NET Core MVC

今週はリポジトリパターンについて学んだ。Visual Studioを使ってASP.NET Core MVCで開発している場合、自動生成されるControllerコードでは生成時に指定したDbContextがコンストラクタで供給される(DI)ことになっている。しかしControllerが直接EF Coreの機能を操作するとなると単体テストが難しく、またDbContextに含まれるすべてのテーブルに対してFromSqlRaw()操作が可能であるという過度の権限付与状態にある。

そこでDBのテーブルまたは集約(Aggregate: エンティティとそれに関連するオブジェクト)に対するいくつかの定型的な操作をメソッドとして提供するリポジトリクラス(のインタフェース)をControllerに与えることで、単体テスト時にはモックリポジトリを通じてDBへのアクセスなしに仮のデータで検証することができるし、設計段階でDB操作を制限することが可能となる。

しかし「ある条件に該当するエンティティのうち、ナビゲーションプロパティ(=別テーブル)が特定の条件を満たしているようなもの」といった複雑なクエリをリポジトリで提供しようとすると特殊ケースのためだけのメソッドが増えてしまう。このような場合は(副作用のない)クエリ組み立てを提供するサービスクラスを通じてControllerが制約付きのEF Core操作を実現できるようにすることが一つの手段として挙げられていた。

Dependency Injectionやリポジトリパターンなどこのところ学んだ概念は総じて、ストレートな実装よりも手間は増えるが、のちの検証や修正を容易にし開発者のミスを未然に防ぐための発想なのだと感じた。