03
2019

ASP.NET CoreでDIを半自動化する「Scrutor」

CATEGORY.NET
引き続きASP.NET Coreネタ。ASP.NET Coreは標準でDIに対応しているのだが、標準のモノは何故か手動での依存関係登録が必須という面倒くさい仕組みになっている。
が、これを半分自動化して、クラス名やらのルールに基づいて一括制御できる「Scrutor」というライブラリがあったので、それを紹介する。
(実は公式ドキュメントの端っこでも少し紹介されてはいるのだが、自分は最初全然見つけられなかったので。)

まず、見つけた中で一番詳しい解説ページはこちら。以下の解説もベースはこちら。
ScrutorはDIライブラリではなく標準DIの依存関係登録に特化したライブラリとのこと。
なので、DIライブラリを丸々差し替えたりせず、あくまで標準ライブラリを使って開発が行えるのがメリット。

Scrutorを使ったDIの例はこんな感じ。Startup.cs の ConfigureServices() での依存関係登録がこういう風になる(使用例はこちら)。
services.Scan(scan => scan
.FromCallingAssembly()
.AddClasses(classes => classes.Where(type => type.Name.EndsWith("Repository") || type.Name.EndsWith("Service")))
.AsSelfWithInterfaces()
.WithScopedLifetime());
上記は大体メソッド名のまんまだが、解説すると実行元のアセンブリ(つまり自プロジェクト)にある XxxRepository または XxxService を、Scopedのライフサイクルで一括登録している。
AsSelfWithInterfaces() はクラスの実体とインタフェース双方をDIに登録する奴。

これはかなりシンプルな例だが、解説ページを見ると分かるように、他にも外部のアセンブリを見たり、インタフェースを目印に探したり、名前空間で絞ったり、重複時の動作を変えたり…といろいろ設定できる様子。

実際の現場では、この例のようにクラス名などで絞り込めることが多いので、この仕組みで十分実用的だと思う。
(一部例外的な奴だけ手動で登録すればいいのだし。)
クラスが増えるたびに手で全部登録するのは流石に非効率的すぎるので、こういうのを使って効率化していきたい。
スポンサーサイト



Tag: ASP.NET .NET

0 Comments

Leave a comment