Почему вызывается функция GetControllerInstance () фабрики контроллеров Castle Windsor с нулевым значением? - PullRequest
12 голосов
/ 16 сентября 2009

Я использую Castle Windsor для управления экземплярами контроллера (среди прочего). Моя фабрика контроллеров выглядит так:

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
        }

Когда я запускаю свое приложение ASP.Net MVC и пытаюсь перейти к «/» (или другому пути), я получаю ArgumentNullException. Я поставил точку останова на вход GetControllerInstance и обнаружил, что он вызывается один раз с моим HomeController, затем второй раз с нулем (что происходит, когда генерируется исключение). Почему он снова вызывается?

Должен ли я изменить метод на что-то вроде этого:

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

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

Ответы [ 4 ]

25 голосов
/ 17 сентября 2009

Оказывается, что вторым запросом был фреймворк MVC, пытающийся найти скрипт, который я включил в Site.Master. Путь не существовал, поэтому, я думаю, он пытался разрешить контроллер (соответствующий /Scripts/sitescripts.js). Я изменил метод на это:

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

И было сгенерировано исключение с понятным сообщением.

4 голосов
/ 25 июля 2010

Возникла эта проблема при следовании книге Pro ASP.NET MVC Framework , добавлено

routes.IgnoreRoute ( "favicon.ico");

к маршрутам в файле global.asax.cs и все работает. Подробнее здесь: сервировка favicon .

3 голосов
/ 27 июля 2010

относительно регистрации всех контроллеров, которые вы обычно делаете так:

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

См. документацию для более подробного объяснения API.

0 голосов
/ 13 июня 2013

Очень позднее добавление: пошаговое руководство на виндзорском сайте кажется хорошим. Это ломает создание контроллера и как он загружается на завод. Он также охватывает шум "favicon.ico".

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

...