我正在使用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调用了一次,然后第二次调用null(这是抛出异常的时候)。为什么再次被召唤?
我应该将方法更改为:
protected override IController GetControllerInstance(Type controllerType)
{
if (controllerType == null)
return null;
return (IController)_container.Resolve(controllerType);
}
答案 0 :(得分:25)
事实证明,第二个请求是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);
}
}
抛出了可理解的消息的异常。
答案 1 :(得分:4)
答案 2 :(得分:3)
关于所有控制器的注册,你通常会这样做:
container.Register(
AllTypes.FromThisAssembly()
.BasedOn<IController>()
.Configure(c => c.Lifestyle.Transient)
);
有关API的更多说明,请参阅the documentation。
答案 3 :(得分:0)
很晚才补充:windsor网站上的分步教程似乎很好。它打破了控制器的创建以及它如何装入工厂。它还涵盖了&#34; favicon.ico&#34;噪声