Extending Ninject - ninject/Ninject GitHub Wiki
The internals of Ninject are broken up into components that are wired together using a lightweight Inversion of Control container (yes, Ninject is actually two Dependency Injection frameworks). This allows custom behavior to be inserted into the resolution pipeline. The components that Ninject use are all accessed from the Components property off of IKernel
. These components are generally loaded from a subclass of KernelBase
such as StandardKernel
but can also be added externally. For more information see Component Extension Points.
The coordinator of all these components is KernelBase
and you can further modify Ninject’s behavior by tapping into the KernelBase extension points.
To modify which components are in use by Ninject you can access the Components
collection directly to add or remove components.
var kernel = new Kernelbase(); kernel.Components.Add<IMissingBindingResolver, MyMissingBindingResolver>();
You can also derive a class from KernelBase
or StandardKernel
and implement the AddComponents
method. In fact, StandardKernel
is merely a thin wrapper around KernelBase
that adds a default set of components. This is StandardKernel.AddComponents()
as it exists in version 2.2:
Components.Add<IPlanner, Planner>(); Components.Add<IPlanningStrategy, ConstructorReflectionStrategy>(); Components.Add<IPlanningStrategy, PropertyReflectionStrategy>(); Components.Add<IPlanningStrategy, MethodReflectionStrategy>(); Components.Add<ISelector, Selector>(); Components.Add<IConstructorScorer, StandardConstructorScorer>(); Components.Add<IInjectionHeuristic, StandardInjectionHeuristic>(); Components.Add<IPipeline, Pipeline>(); Components.Add<IActivationStrategy, ActivationCacheStrategy>(); Components.Add<IActivationStrategy, PropertyInjectionStrategy>(); Components.Add<IActivationStrategy, MethodInjectionStrategy>(); Components.Add<IActivationStrategy, InitializableStrategy>(); Components.Add<IActivationStrategy, StartableStrategy>(); Components.Add<IActivationStrategy, BindingActionStrategy>(); Components.Add<IActivationStrategy, DisposableStrategy>(); Components.Add<IBindingResolver, StandardBindingResolver>(); Components.Add<IBindingResolver, OpenGenericBindingResolver>(); Components.Add<IMissingBindingResolver, DefaultValueBindingResolver>(); Components.Add<IMissingBindingResolver, SelfBindingResolver>(); #if !NO_LCG if (!Settings.UseReflectionBasedInjection) { Components.Add<IInjectorFactory, DynamicMethodInjectorFactory>(); } else #endif { Components.Add<IInjectorFactory, ReflectionInjectorFactory>(); } Components.Add<ICache, Cache>(); Components.Add<IActivationCache, ActivationCache>(); Components.Add<ICachePruner, GarbageCollectionCachePruner>(); #if !NO_ASSEMBLY_SCANNING Components.Add<IModuleLoader, ModuleLoader>(); Components.Add<IModuleLoaderPlugin, CompiledModuleLoaderPlugin>(); #endif