This may be stupid question, but I am looking at Ninject sources and don\'t see NInject registering its own controller factory. I also don\'t see any IControllerFactor
DefaultControllerFactory
, the same as non-Ninject applications. DefaultControllerFactory
finds type for controller (TaskController
).DefaultControllerFactory
has internal class called DefaultControllerActivator
. DefaultControllerActivator
has method called Create
, which returns controller instance. DefaultControllerFactory
asks DefaultControllerActivator
for TaskController
type instance.DefaultControllerActivator.Create
uses IDependencyResolver
. This is where Ninject
comes in. Since Ninject
implements its own resolver and sets it at the start of application, he gets request for TaskController
instance.Ninject
finds constructor for this type, injects parameters, returns controller instance.MVC3 now recommends the usage of the IDependencyResolver
interface instead of the good old IControllerFactory
when dealing with DI. You can look at more details of this interface here.
This is the new Ninject class responsible for injecting the dependencies.
Since controllers are concrete types, Ninject will do self bind. Below is a snippet from ninject.complex.com
Bear in mind that only concrete types can be self-bound; abstract types and interfaces won't work. Also, if you request an instance of a type that can be self-bound, and there are no bindings defined for the type, Ninject will automatically create an implicit self-binding. It's up to you whether you want to define your bindings explicitly, or let Ninject figure it out.
If you do need to inject parameters into the constructor. You can create a class inherits from INinjectModule
and do the binding there.