web-dev-qa-db-ja.com

WebAPIのDependencyResolver.SetResolverとHttpConfiguration.DependencyResolverの違いは何ですか

AutoFacをIoCとして使用する既存のプロジェクトがあります。

登録コードには次の行があります。

var resolver = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(resolver));
config.DependencyResolver = new AutofacWebApiDependencyResolver(resolver);

私の質問は、DependencyResolver.SetResolverHttpConfiguration.DependecyResolverの違いは何ですか?なぜ両方を割り当てる必要があるのですか?

39

同じプロジェクトで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を混在させると、あいまいな名前の競合が発生します。

41
Steven

MVCとWeb APIを混同していると思います。

DependencyResolver.SetResolver

MVCの場合 で、Assembly System.Web.Mvc。さもないと:

Configuration.DependencyResolver

web APiの場合、Assembly System.Web.Http

そのため、プロジェクトではMVCとWeb Apiの両方を使用しているため、それぞれにIoCを設定するために2行表示されます

39
cuongle