Perché il nome GetControllerInstance () del mio controller Castle Windsor viene chiamato con un valore nullo?

Sto usando Castle Windsor per gestire le istanze del controller (tra le altre cose). La mia fabbrica di controller si presenta così:

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 applicazione ASP.Net MVC e provo ad andare su “/” (o su un altro percorso), ottengo 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?

Dovrei cambiare il metodo in qualcosa del genere:

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

Risulta che la seconda richiesta era il framework MVC che cercava 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 in questo modo:

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

E fu lanciata un’eccezione con un messaggio comprensibile.

Aveva questo problema quando si seguiva il libro Pro ASP.NET MVC Framework , aggiunto

routes.IgnoreRoute ( “favicon.ico”);

alle rotte nel file global.asax.cs e funziona. Vedi di più qui: servire favicon .

per quanto riguarda la registrazione di tutti i controller di solito lo fai in questo modo:

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

Vedere la documentazione per ulteriori spiegazioni dell’API.

Aggiunta molto tardiva: il tutorial passo per passo sul sito di windsor sembra buono. Interrompe la creazione di un controller e il modo in cui viene caricato in fabbrica. Copre anche il rumore “favicon.ico”.

http://docs.castleproject.org/(S(0jvahybwt45sgwzwirpa3455))/Windsor.Windsor-tutorial-part-one-getting-Windsor.ashx