2010-12-01 2 views
1

私のMS MVCアプリケーションにDIを導入していますが、カスタムコントローラファクトリからコントローラをインスタンス化できません。オーバーライドされた "GetControllerInstance"が呼び出されていないようです。MVC - 城ウィンザーコントローラファクトリの作成 - このオブジェクト用に定義されたパラメータのないコンストラクタなし

誰かが私に行方不明を教えてもらえますか?

マイコントローラーファクトリー:

public class WindsorControllerFactory : DefaultControllerFactory 
{ 
    public WindsorControllerFactory() 
    { 
     var controllerTypes = from t in AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()) 
           where typeof (IController).IsAssignableFrom(t) 
           select t; 
     foreach (Type controllerType in controllerTypes) 
     { 
      ApplicationContainer.Container.AddComponentLifeStyle(controllerType.FullName, controllerType, 
                   LifestyleType.Transient); 
     } 
    } 

    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) 
    { 
     if(controllerType !=null) 
     { 
      return (IController) ApplicationContainer.Container.Resolve(controllerType); 
     } 
     return base.GetControllerInstance(requestContext, controllerType); 
    } 
} 

}

のApplication_Start:

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

コントローラの工場がインスタンス化されると、コントローラーを解決するために使用されていないことと思われます。私は 'GetControllerInstance'にブレークポイントを設定しましたが、決してヒットしません。

結果は、このオブジェクトに対して定義されたパラメータなしコンストラクタです。私はこれにGetControllerInstanceを変更

private WindsorContainer _container; 

    public WindsorControllerFactory(WindsorContainer container) 
    { 
     _container = container; 
     _container.Register(AllTypes.Of<IController>().FromAssembly(
     typeof(BaseFactoryController).Assembly).Configure(
      c => c.Named(c.Implementation.Name.ToLowerInvariant()).LifeStyle.Transient)); 
    } 

は今、私はヌルcontrollerTypeを無視する必要がありますか?!例外は

アップデートを投げこれがコメントされていない場合:

//base.GetControllerInstance(requestContext、controllerType);

私の.jsファイルをコントローラとして扱い始める。どの

protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) 
    { 
     if (controllerType == null) 
     { 
      return null; 
     } 
     //base.GetControllerInstance(requestContext, controllerType); 
     return (IController) _container.Resolve(controllerType); 
    } 
+0

jsをコントローラとして扱うことについて、同じ質問、http://stackoverflow.com/questions/1598421/why-is-castle-windsor-trying-to-resolve-my-content-and-scripts-folderと同じ勧告-as-a-co –

答えて

1

creating WindsorContainer results in type conversion error見る(ではない、非常に同じ質問を、それはそれにもかかわらず、同じ答えだ)httpExceptionをスロー

+0

もし可能であれば、私はむしろ別のライブラリを紹介したくはありません。私はこの実装がなぜ機能しないのかを知ることを好む。 – Nick

+0

@ニック:MVCContribの実装を参照として使用して、自分と比較することができます。 –

+0

@Maurcio:あなたは勝ちます:)私はMVCContibを見ています。 MVCContrib.Castle名前空間はどこですか? MVCContrib.dllには表示されません。 – Nick

0

あなたが持つかもしれ、他の問題は、この呼び出しです:

AppDomain.CurrentDomain.GetAssemblies() 

..アセンブリが実際にAppDomainにロードされていない場合は、使用可能なすべてのコントローラを取得しないでください。 AppDomainは必要なときにアセンブリを読み込みます。したがって、コードで明示的に呼び出さなかった場合は読み込まれません。

+0

私のポストをこれの新しい実装で更新しています。 – Nick

関連する問題