El Ninject son las herramientas utilizadas para registrar los distintos tipos con el recipiente COI. La ventaja es que estos módulos se guardan en sus propias clases. Esto le permite poner diferentes niveles/servicios en sus propios módulos.
// 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>();
}
}
Tener varios módulos permite separar las preocupaciones, incluso dentro de su contenedor de IoC.
El resto de su pregunta parece que se trata más de IoC y DI en conjunto, y no solo de Ninject. Sí, podría usar objetos de configuración estáticos para hacer casi todo lo que hace un contenedor IoC. Los contenedores IoC se vuelven realmente agradables cuando tienes múltiples jerarquías de dependencias.
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){}
}
Building ClassC es un dolor en este punto, con múltiples profundidades de interfaces. Es mucho más fácil pedirle al kernel un IInterfaceC.
var newc = ApplicationScope.Kernel.Get<IInterfaceC>();
¿LinqToSqlDataContextModule debería extender StandardModule? –
@Mark Gibaud no en Ninject 2. StandardModule se ha ido y reemplazado con NinjectMdule - http://github.com/enkari/ninject/tree/master/src/Ninject/Modules/ –
Ese es un buen ejemplo, pero ¿qué pasa con la capacidad de prueba? Constantemente escucho cómo un contenedor DI/IoC puede ayudarme con la capacidad de prueba, pero estoy teniendo dificultades para encontrar un ejemplo real que muestre que Ninject no contaminará mi código y también facilitará la capacidad de prueba. ¿Hay algún proyecto de código abierto del mundo real que yo pueda ver para entender la idea? –