J'utilise Castle Windsor pour gérer les instances de contrôleur (entre autres). Mon usine de contrôleur ressemble à ceci:Pourquoi GetControllerInstance() de mon usine de contrôleur Castle Windsor est-il appelé avec une valeur nulle?
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
}
Lorsque je démarre mon application ASP.Net MVC et essayer d'aller à «/» (ou un autre chemin), je reçois un ArgumentNullException. J'ai mis un point d'arrêt à l'entrée de GetControllerInstance et j'ai trouvé qu'il s'appelait une fois avec mon HomeController, puis une seconde fois avec null (qui est quand l'exception est levée). Pourquoi est-il appelé à nouveau?
ce que je devrais changer la méthode à quelque chose comme:
protected override IController GetControllerInstance(Type controllerType)
{
if (controllerType == null)
return null;
return (IController)_container.Resolve(controllerType);
}
Pourquoi vous entaillez l'enregistrement avec la réflexion au lieu d'utiliser l'API d'inscription appropriée? –
@Krzysztof - Je suivais l'exemple de Steve Sanderson. Si vous souhaitez publier un meilleur moyen d'enregistrer toutes les classes qui héritent du contrôleur, veuillez le faire. – scottm