Почему мой контроллер Castle Windsor factory GetControllerInstance() вызывается с нулевым значением?
Я использую Castle Windsor для управления экземплярами контроллера (между прочим). Мой контроллер factory выглядит следующим образом:
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);
}
Ответы
Ответ 1
Получается, что вторым запросом была MVC-инфраструктура, пытающаяся найти script, включенный в Site.Master. Путь не существовал, поэтому я предполагаю, что он попытался разрешить контроллер (который соответствовал /Scripts/sitescripts.js). Я изменил метод на это:
protected override IController GetControllerInstance(Type controllerType)
{
if (controllerType != null)
{
return (IController)_container.Resolve(controllerType);
}
else
{
return base.GetControllerInstance(controllerType);
}
}
И было создано исключение с понятным сообщением.
Ответ 2
Если эта проблема возникла при выполнении Pro ASP.NET MVC Framework, добавлена
routes.IgnoreRoute( "favicon.ico" );
для маршрутов в файле global.asax.cs, и он работает. Подробнее здесь: услуга favicon.
Ответ 3
относительно регистрации всех контроллеров, которые вы обычно делаете так:
container.Register(
AllTypes.FromThisAssembly()
.BasedOn<IController>()
.Configure(c => c.Lifestyle.Transient)
);
Подробнее об API-интерфейсе см. документацию.
Ответ 4
Очень позднее дополнение: пошаговое руководство на сайте Windsor кажется хорошим. Он разрушает создание контроллера и его загрузку в factory. Он также охватывает шум "favicon.ico".
http://docs.castleproject.org/(S(0jvahybwt45sgwzwirpa3455))/Windsor.Windsor-tutorial-part-one-getting-Windsor.ashx