Tutorial :Why is my Castle Windsor controller factory's GetControllerInstance() being called with a null value?


I am using Castle Windsor to manage controller instances (among other things). My controller factory looks like this:

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          }  

When I start up my ASP.Net MVC application and try to go to "/" (or another path), I get an ArgumentNullException. I put a break point on entry of the GetControllerInstance and found that it's called once with my HomeController, then a second time with null (which is when the exception is thrown). Why is it being called again?

Should I change the method to something like this:

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


It turns out that the second request was the MVC framework trying to find a script I included in the Site.Master. The path did not exist, so I guess it tried to resolve a controller (that matched /Scripts/sitescripts.js). I changed the method to this:

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

And an exception with an understandable message was thrown.


Had this problem when following the Pro ASP.NET MVC Framework book, added


to the routes in the global.asax.cs file and it works. See more here: serving favicon.


regarding registration of all the controllers you'd usually do it like this:

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

See the documentation for more explanation of the API.


Very late addition: The step-by-step tutorial at the windsor site seems good. It breaks down the creation of a controller and how it's loaded into the factory. It also covers the "favicon.ico" noise.


Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Next Post »