¿Por qué se llama a GetControllerInstance () de mi fábrica de controladores Castle Windsor con un valor nulo?

StackOverflow https://stackoverflow.com/questions/1434900

  •  07-07-2019
  •  | 
  •  

Pregunta

Estoy usando Castle Windsor para administrar instancias de controlador (entre otras cosas). Mi fábrica de controladores se ve así:

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
        }

Cuando inicio mi aplicación ASP.Net MVC e intento ir a " / " (u otra ruta), obtengo una excepción ArgumentNullException. Puse un punto de interrupción en la entrada de GetControllerInstance y descubrí que se llama una vez con mi HomeController, luego una segunda vez con nulo (que es cuando se lanza la excepción). ¿Por qué se vuelve a llamar?

¿Debo cambiar el método a algo como esto:

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

    return (IController)_container.Resolve(controllerType);
}
¿Fue útil?

Solución

Resulta que la segunda solicitud fue el marco MVC que intentaba encontrar un script que incluí en el Site.Master. La ruta no existía, así que supongo que intentó resolver un controlador (que coincidía con /Scripts/sitescripts.js). Cambié el método a esto:

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

Y se lanzó una excepción con un mensaje comprensible.

Otros consejos

Tenía este problema al seguir el libro Marco Pro ASP.NET MVC Framework , añadido

  

rutas.IgnoreRoute (" favicon.ico ");

a las rutas en el archivo global.asax.cs y funciona. Ver más aquí: Sirviendo favicon .

con respecto al registro de todos los controladores, generalmente lo haría así:

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

Consulte la documentación para obtener más explicaciones sobre la API .

Adición muy tardía: el tutorial paso a paso en el sitio de Windsor parece bueno. Descompone la creación de un controlador y cómo se carga en la fábrica. También cubre el "favicon.ico" ruido.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top