40

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

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

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

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

4

3 に答える 3

44

同じプロジェクトでMVCとWebAPIが混在しないようにします。WebAPI用のVisualStudioテンプレートがプロジェクトをMVCと自動的に混合するため、Microsoftはこれを提案しているようですが、これは悪い考えです。

アーキテクチャの観点から、MVCとWebAPIは完全に異なります。MVCは、エンドユーザーエクスペリエンスを最適化することを目的としたUIテクノロジーです。Web APIは、(クライアント)開発者のエクスペリエンスを最適化することを目的としたWebサービステクノロジです。

MVCとWebAPIは、プレゼンテーション固有のコードを共有しません。それらを同じプロジェクトに混在させると、そのプロジェクトはより大きく、より複雑になります。

しかし、おそらくさらに重要なのは、両方のアプリケーションタイプに独自のDI構成のニーズがあることです。それらには独自のコンポジションルートがあり、それを単一のDI構成(単一のDIコンテナー)に混合すると、構成が非常に困難になる可能性があります。

そして最後に、同じプロジェクトでWeb APIとMVCを混在させると、名前の競合があいまいになります。これは、Web APIアセンブリには、MVCの対応するものとまったく同じ名前を共有するクラスが多数含まれているためです(ただし、実装はわずかに異なります)。

于 2013-03-19T09:42:14.567 に答える
42

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

DependencyResolver.SetResolver

MVC 用で、 assembly に属し System.Web.Mvcます。さもないと:

Configuration.DependencyResolver

Web API の場合は、 assembly に属し System.Web.Httpます。

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

于 2013-03-19T08:58:23.087 に答える
19

DependencyResolver.SetResolverはMVC構造であり、MVCを使用してIOCをサポートするために必要です。

これGlobalConfiguration.Configuration.DependencyResolverはWebApi固有です。

同じプロジェクト内でMVCとWebApiの両方をサポートする場合にのみ、両方が必要になります。

DependencyResolver.SetResolverNinject Mvc3にはこのためのブートストラップがあるため、通常は明示的に設定する必要がないことも指摘しておく価値があります...ここを参照してください

于 2013-03-19T08:53:55.463 に答える