2009-04-05 28 views
27

最近、StructureMapを使用して依存性注入を実装しようとしました。私はすべての方法で例を追跡することができたが、私はアプリケーションを実行しようとするたびに例外が発生している。私のコントローラ工場のコードスニペットをいくつか紹介します。カスタムコントローラファクトリ、ASP.NET MVCの依存関係注入/構造マップの問題

public class StructureMapControllerFactory : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(Type controllerType) 
    { 
     if (controllerType == null) 
      throw new ArgumentNullException("controllerType"); 

     return ObjectFactory.GetInstance(controllerType) as Controller; 
    } 
} 

私のGlobal.asaxのは、私のすべての依存関係を登録し、静的ブートストラップクラスを呼び出しますが、StructureMapControllerFactoryのGetControllerInstanceが二回呼ばなっているように見えます。最初に呼び出されたときは、適切なcontrollerTypeが渡されますが、2回目の呼び出しでは常にnullになります。

初めてGetControllerInstanceが呼び出されると、タイプは正しいHomeControllerに設定されます。コードHomeControllerで発生し、View()を返します。 View()の戻り時に、Page_Loadイベントはaspxファイルに対して呼び出されます。それを踏んで、それは次の行に到着します:

httpHandler.ProcessRequest(HttpContext.Current);

これは、GetControllerInstanceが2回目に呼び出される場所です。

protected void Application_Start() 
    { 
     RegisterRoutes(RouteTable.Routes); 

     Bootstrapper.ConfigureStructureMap(); 

     ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory()); 
    } 

私は依存性注入の作業を取得するために非常に熱心だと誰もが私を助けることができれば、最も感謝し、次のようになります。

は、ここで関連するかもしれない私のGlobal.asaxのビットです。 :)

+1

私はまったく同じ問題を抱えています。 – Micah

+0

あなたはどのようにコントローラを登録しますか? – Sebastian

+0

良い問題の説明。 –

答えて

45

UPDATE これが起こっている理由は、画像は、CSSファイルで指定され、その画像が欠落している場合、ルーティングフレームワークは、コントローラへのURLをマッピングしようとすることです。下記のような経路を無視すると、エラーが発生しないようにしますが、欠落しているリソースがあることを通知する良い方法であるため、実装しないことにしました。

構造マップhereを使用して、依存関係注入の設定例と詳細な説明が表示されます。

私は同じ問題を抱えていましたが、私はそれを理解したと思います。あなた自身のController Factoryを提供しようとするときは何らかの理由で、いくつかのIgnoreRoute定義を追加する必要があります。

if(controllerType == null) 
    return base.GetControllerInstance(controllerType) 

これは、少なくともあなたにそれがcontrollerTypeがNULLであることを原因となっている要求があるまでのようにエラーメッセージでより多くの情報を提供します:私はどうなる最初の事はあなたのGetControllerInstanceメソッドに次の行を追加しています。私の特定のケースでは、私は次のように設定され、私のCSSファイルで背景画像を持っていた:

background: url(img/logo.gif); 

だから何が起こるかは、ルーティングは「IMG」と呼ばれるコントローラとにlogo.gifか何かを一緒に実行するアクションを探していますそれらの行。明らかに正しい動作ではありません。

私は、グローバルにIgnoreRoute定義を追加する必要があることを知った。このような私のサイトの「コンテンツ」ディレクトリに何かを無視しasaxファイル:デフォルトのControllerFactoryでこれを行う必要はありません、なぜ

routes.IgnoreRoute("{Content}/{*pathInfo}"); 

は、私はまだわからないんだけど、それにもかかわらず、それが動作します。

おそらくfavicon.icoで同じ問題が発生します。特にあなたがGoogleのcrhomeを使用している場合。これを追加する必要があります:

routes.IgnoreRoute("{*favicon}", new {[email protected]"(.*/)?favicon.ico(/.*)?"}) 
+0

を投げるべきだと思います。これはおそらく理由、私が家にいたときに返信します – kitsune

+1

私はWindsor ControllerFactoryで同じ問題を抱えていました。修正のおかげで、それは素晴らしい作品です。 –

+0

+ 1の背景:url(img/logo.gif); 私の間違いは、JQuery UIを使用していて、画像ファイルを含んでいなかったことです。私は機能の小さな部分を使用していたと私は必要な画像を実現していない - woops! – ozz

4

あなたのプロジェクトに追加されていない静的なファイル(javascriptファイルなど)を要求していると思われます。または、参照ファイルに誤字があります。あなたのブラウザのWeb要求を監視し、必要なときに静的ファイルに正しく解決されないWeb要求を探す必要があります。あなたがこれを行うためにIEを使用している場合は、FFやバイブレータでFirebugを使用することができます。

関連する問題