2012-02-29 11 views
7

ASP.net MVC4には、CRUD機能をデータモデルに公開するためのWeb APIという新しい概念があります。これらのコントローラの基本クラスは、ApiControllerから派生したDataControllerです。ASP.netコントローラがIControllerから派生しない理由

残念ながら、このApiControllerは、これらがIControllerのインスタンスを返すことになっているとして、これらの要求は、通常のカスタムコントローラの工場を介して処理することができないので、問題であるIControllerから派生しません。

誰もが、IControllerから派生しないMVCプロジェクトのコントローラーを持っている理由がわかりません。これは、すべてのコントローラーをインスタンス化できないため、カスタムコントローラーファクトリーを壊すためです。あなたのプロジェクトで。

つまり、この継承のためにDIコンテナを使用して依存関係を挿入することはできません。

答えて

7
に似て(しかしかなり同じではない)であります

私もこの同じ質問をマイクロソフトに送って、Eilon Lipton(それについてはthx)の次の返事を得ました:

短編小説は、ASP.NET MVCとASP.NET Web APIは同じデザインコンセプト(依存性注入、カスタム実装をプラグインするための多数のインターフェイス、および簡単なテスト容易性)を共有しますが、基礎となるHTTPスタックMVCは、ASP.NETで10年以上使用されてきたSystem.Webスタックをベースに構築されています。 Web APIは新しいSystem.Net.Httpスタックをベースに構築されており、ホスティング(IIS +カスタムホスト+ユニットテストホスト)の柔軟性が向上し、テスト性と拡張性が向上します。 IControllerとIHttpControllerを比較すると、System.Webをスタックの上下に使用し、もう一方はスタックを使用しないことがわかります。

これに関係なく、ASP.NETスタック(MVC、Webフォーム、Web API、Webページ(およびRazor))上に構築されたすべてのテクノロジは、アプリケーション内で並行して動作し、アプリケーションの各部分を構築するための適切な部分を選択する必要があります。個々のコンポーネント内の個々の実装は互換性がありませんが、依存関係インジェクションシステム、ロギングツール、データプロバイダなど、それぞれ同じサービスに配線することができます。

私たちがこの主題に私たちのポストを公開すると、それは事をさらに明確にするべきだと私は思う。

1

DIをASP.Net WebAPIで実行するには、DIコンテナの依存リゾルバを作成する必要があります。

Ninject

public class NinjectDependencyResolver : System.Web.Http.Services.IDependencyResolver 
{ 
    private static IKernel m_Kernel; 

    public NinjectDependencyResolver() 
    { 
     m_Kernel = new StandardKernel(); 
    } 

    public NinjectDependencyResolver(IKernel myKernel) 
    { 
     m_Kernel = myKernel; 
    } 

    public object GetService(Type serviceType) 
    { 
     return m_Kernel.TryGet(serviceType); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return m_Kernel.GetAll(serviceType); 
    } 
} 

ため、次の作品、その後使用してGlobal.ascxファイルでそれをバインドします

GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new NinjectDependencyResolver(yourKernel)); 

これはMVC3の依存性注入

+1

これまで私自身のコントローラファクトリを使用していましたが、このクラスはwebapiコントローラの場合でも呼び出されます。 DependencyResolverを呼び出すアプリケーションを取得できません。すべてのリクエストは私自身のControllerFactoryを経由します(このカスタムファクトリを削除してもそれは変わりません)。 – thekip

関連する問題