AutoFacをIoCとして使用する既存のプロジェクトがあります。
登録コードには次の行があります。
var resolver = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(resolver));
config.DependencyResolver = new AutofacWebApiDependencyResolver(resolver);
私の質問は、DependencyResolver.SetResolver
とHttpConfiguration.DependecyResolver
の違いは何ですか?なぜ両方を割り当てる必要があるのですか?
同じプロジェクトでMVCとWeb APIを混在させないでください。 Web APIのVisual StudioテンプレートはプロジェクトとMVCを自動的に混合するため、Microsoftはこれを提案しているようですが、これは悪い考えです。
アーキテクチャの観点から見ると、MVCとWeb APIはまったく異なります。 MVCは、エンドユーザーエクスペリエンスを最適化することを目的としたUIテクノロジーです。 Web APIは、(クライアント)開発者のエクスペリエンスを最適化することを目的としたWebサービステクノロジーです。
MVCとWeb APIは、プレゼンテーション固有のコードを共有しません。それらを同じプロジェクトに混在させると、そのプロジェクトはより大きく複雑になります。
しかし、おそらくさらに重要なことは、両方のアプリケーションタイプに独自のDI構成のニーズがあることです。それらには独自の Composition Root があり、それを単一のDI構成(単一のDIコンテナ)に混在させると、構成が非常に難しくなります。
そして最後に、Web APIアセンブリには、MVCの対応するものとまったく同じ名前を共有する(ただし実装がわずかに異なる)クラスが多数含まれているため、同じプロジェクトでWeb APIとMVCを混在させると、あいまいな名前の競合が発生します。
MVCとWeb APIを混同していると思います。
DependencyResolver.SetResolver
MVCの場合 で、Assembly System.Web.Mvc
。さもないと:
Configuration.DependencyResolver
web APiの場合、Assembly System.Web.Http
。
そのため、プロジェクトではMVCとWeb Apiの両方を使用しているため、それぞれにIoCを設定するために2行表示されます