2012-03-25 9 views
5

別のアセンブリからControllerをロードしようとしていますが、私はここで止まっています。私はRouteをWebアプリケーションでコントローラが別のアセンブリからロードされていませんか?

  1. Webアプリケーション
  2. クラスライブラリ

定義さ:

routes.MapRoute("Root", "root/{Action}", 
        new {Controller = "Root", Action = "Index" }); 

今、私は次のように打ったとき、私は二つのプロジェクトを持っている

URLでは、ルートは一致しますが、404エラーがスローされます。 これはなぜ起こっているのか誰にでも教えてもらえますか?

:私もルートにnamespacesプロパティを追加しようとした

public class ControllerFactory : DefaultControllerFactory { 
    protected override IController GetControllerInstance(RequestContext reqContext, Type controllerType) 
    { 
     // reqContext.Route is correct and has the "Root" route loaded 
     // controllerType seems to be null ?? 

     // if I break execution here and manually set controllerType to 
     // typeof(ClassLibrary.RootController) and continue from there, 
     // then everything works as expected... 

     // So this method is being called without controllerType... but why?? 
    } 
} 

http://webapp/root 

私はカスタムコントローラファクトリを追加しようとしました(PS RootControllerは、クラスライブラリにあります)

routes.MapRoute("Root", "root/{Action}", 
       new { 
       Controller = "Root", 
       Action = "Index", 
       Namespaces = new[] { typeof(RootController).Namespace }      
       }); 
+1

問題を再現できません。 –

+0

@Max Toro、私の答えを見てください... – Ropstah

答えて

4

多くのデバッグと不満の後、コントローラクラスがprivateと宣言されていますが、これはsで動作しませんcenario。

ControllerFactoryが同じ名前空間にあるにもかかわらず、コントローラキャッシュを作成するクラスはありません。したがってDefaultControllerFactoryベースクラスによって行われたGetControllerInstanceへの要求はRootControllerクラスを見つけることができません。

RootControllerpublicとして宣言すると、この問題が解決されます。

+0

DefaultControllerFactoryは、BuildManager.GetReferencedAssembliesから返されたアセンブリ内のすべての型を検索し、このフィルタを返します。 'return(((t!= null)&& t.IsPublic)&& ( "Controller"、StringComparison.OrdinalIgnoreCase)&&!t.IsAbstract))&& typeof(IController).IsAssignableFrom(t)); } 'コントローラを見つける。 –

関連する問題