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);
}
Perché hacking del registrazione con la riflessione invece di utilizzare una corretta API di registrazione? –
@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