为什么我的Castle Windsor控制器工厂的GetControllerInstance()被调用null值?

时间:2009-09-16 19:07:07

标签: c# asp.net-mvc castle-windsor

我正在使用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);
}

4 个答案:

答案 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;噪声

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