Les modules Ninject sont les outils utilisés pour enregistrer les différents types avec le conteneur IoC. L'avantage est que ces modules sont ensuite conservés dans leurs propres classes. Cela vous permet de placer différents tiers/services dans leurs propres modules.
// some method early in your app's life cycle
public Kernel BuildKernel()
{
var modules = new INinjectModule[]
{
new LinqToSqlDataContextModule(), // just my L2S binding
new WebModule(),
new EventRegistrationModule()
};
return new StandardKernel(modules);
}
// in LinqToSqlDataContextModule.cs
public class LinqToSqlDataContextModule : NinjectModule
{
public override void Load()
{
Bind<IRepository>().To<LinqToSqlRepository>();
}
}
Le fait de disposer de plusieurs modules permet de séparer les préoccupations, même au sein de votre conteneur IoC.
Le reste de votre question semble concerner davantage IoC et DI dans leur ensemble, et pas seulement Ninject. Oui, vous pouvez utiliser des objets statiques de configuration pour faire à peu près tout ce que fait un conteneur IoC. Les conteneurs IoC deviennent vraiment intéressants lorsque vous avez de multiples hiérarchies de dépendances.
public interface IInterfaceA {}
public interface IInterfaceB {}
public interface IInterfaceC {}
public class ClassA : IInterfaceA {}
public class ClassB : IInterfaceB
{
public ClassB(IInterfaceA a){}
}
public class ClassC : IInterfaceC
{
public ClassC(IInterfaceB b){}
}
La construction de ClassC est un véritable calvaire à ce stade, avec de multiples profondeurs d'interfaces. Il est beaucoup plus facile de demander au noyau une IInterfaceC.
var newc = ApplicationScope.Kernel.Get<IInterfaceC>();