2009-09-16 17 views
11

Sto usando Castle Windsor per gestire le istanze del controller (tra le altre cose). La mia fabbrica di controllo simile a questa:Perché viene chiamato il valore GetControllerInstance() del controllore Castle Windsor con un valore null?

public class WindsorControllerFactory : DefaultControllerFactory 
    { 
     private WindsorContainer _container; 

     public WindsorControllerFactory() 
     { 
      _container = new WindsorContainer(new XmlInterpreter()); 

      var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes() 
            where typeof(Controller).IsAssignableFrom(t) 
            select t; 

      foreach (Type t in controllerTypes) 
      { 
       _container.AddComponentLifeStyle(t.FullName, t, LifestyleType.Transient); 
      } 
     } 

     protected override IController GetControllerInstance(Type controllerType) 
     { 
      return (IController)_container.Resolve(controllerType); // ArgumentNullException is thrown here 
     } 

Quando avvio la mia domanda ASP.Net MVC e cercare di andare a "/" (o un altro percorso), ottengo un ArgumentNullException. Ho inserito un punto di interruzione nella voce GetControllerInstance e ho scoperto che è chiamato una volta con il mio HomeController, quindi una seconda volta con null (ovvero quando viene generata l'eccezione). Perché viene chiamato di nuovo?

Devo cambiare il metodo per qualcosa di simile:

protected override IController GetControllerInstance(Type controllerType) 
{ 
    if (controllerType == null) 
     return null; 

    return (IController)_container.Resolve(controllerType); 
} 
+0

Perché hacking del registrazione con la riflessione invece di utilizzare una corretta API di registrazione? –

+0

@Krzysztof - Stavo seguendo l'esempio di Steve Sanderson. Se vuoi pubblicare un modo migliore per registrare tutte le classi che ereditano dal controller, ti preghiamo di farlo. – scottm

risposta

24

Si scopre che la seconda richiesta era il framework MVC cercando di trovare uno script che ho incluso nel Site.master. Il percorso non esisteva, quindi suppongo che abbia provato a risolvere un controller (che corrispondesse a /Scripts/sitescripts.js). Ho cambiato il metodo a questo:

protected override IController GetControllerInstance(Type controllerType) 
{ 
    if (controllerType != null) 
    { 
     return (IController)_container.Resolve(controllerType); 
    } 
    else 
    { 
     return base.GetControllerInstance(controllerType); 
    } 
} 

E è stata generata un'eccezione con un messaggio comprensibile.

+1

Grazie, ho passato ore a cercare questa soluzione. – Geo

+0

Grazie, mi ha aiutato anche. –

+1

E io tre. Solo per notare, per MVC 2.0, è questa base di ritorno .GetControllerInstance (requestContext, controllerType); – Gabe

4

avuto questo problema quando si segue il libro Pro ASP.NET MVC Framework, ha aggiunto

routes.IgnoreRoute ("favicon.ico");

ai percorsi nel file global.asax.cs e funziona. Vedi di più qui: serving favicon.

+0

Aveva lo stesso problema del tizio che faceva la domanda e, mentre una migliore gestione degli errori è una buona idea, il vero problema era che la pagina si stava caricando e poi andava cercare la favicon. L'aggiunta della riga sopra ha risolto subito il problema. – colethecoder

+0

@colethecoder Li ho contenti –

3

per quanto riguarda la registrazione di tutti i controllori che ci si solito fare in questo modo:

container.Register(
    AllTypes.FromThisAssembly() 
     .BasedOn<IController>() 
     .Configure(c => c.Lifestyle.Transient) 
); 

Vedi the documentation maggiori spiegazioni delle API.

Problemi correlati