ASP.NET Web APIはコントローラに依存性を注入するためのDependency Resolverインターフェイスを導入する。しかし、Mark Seemann氏は目的を実現するためにはIHttpControllerActivatorインターフェイスの方が適していることを、サンプルを使って指摘している。
IDependencyResolverの問題は何か。氏曰く、
(IDependencyResolver)の実装に問題があります。与えられるのはTypeインスタンスだけで、オブジェクトを返さなければなりませんが、コンテキストがわかりません。依存性のグラフがどの程度深いのかわかない状態で同じサービスのインスタンスを複数回提供するように求められると、同じHTTPリクエスト内で求められたのか、複数のHTTPリクエストが並列で求めてきたのか判断できません。
Mark氏はサービスコンテナ内をIHttpControllerActivatorインターフェイスに置き換えた方が良いと言う。IHttpControllerActivatorはコンテキストを提供するHttpRequestMessageオブジェクトを提供する。氏はカスタムのシンプルなDIコンテナを使った例やCastle Windsorを使った例を示している。
どちらの方法もコントローラはHTTPリクエストのたびに作成され、リクエストがハンドルされた後に破棄される。主な違いはTypeを解決する時にコンテナが参照できる情報だ。
また、この議論自体もASP.NETの拡張性の高さの一例と言えるだろう。