Bien, hace poco que he estado leyendo en ninject pero estoy teniendo problemas para entender qué es lo que lo hace mejor sobre por qué se refieren a como 'pobre' DI en la página wiki. Lo triste es que fui sobre todas sus páginas en la wiki y todavía no lo entiendo = (¿Tiene problemas para entender ninject (o solo el contenedor IOC en general) con respecto a la DI de fábrica?
Normalmente voy a envolver mis clases de servicio en un patrón de fábrica que se encarga de la DI, así:.
public static class SomeTypeServiceFactory
{
public static SomeTypeService GetService()
{
SomeTypeRepository someTypeRepository = new SomeTypeRepository();
return = new SomeTypeService(someTypeRepository);
}
}
que me parece mucho a los módulos:
public class WarriorModule : NinjectModule {
public override void Load() {
Bind<IWeapon>().To<Sword>();
Bind<Samurai>().ToSelf().InSingletonScope();
}
}
Donde cada clase tendría que está módulo asociado y enlazarlo del constructor para una aplicación concreta Mientras que el código ninject es 1 línea menos yo no estoy viendo. la ventaja, siempre que agregue/elimine constructores o cambie el implementación de un constructor de interfaz, tendría que cambiar el módulo más o menos de la misma manera que lo haría en la fábrica no? Entonces no veo la ventaja aquí.
Entonces pensé que podía llegar a una fábrica genérica convención basada modo:
public static TServiceClass GetService<TServiceClass>()
where TServiceClass : class
{
TServiceClass serviceClass = null;
string repositoryName = typeof(TServiceClass).ToString().Replace("Service", "Repository");
Type repositoryType = Type.GetType(repositoryName);
if (repositoryType != null)
{
object repository = Activator.CreateInstance(repositoryType);
serviceClass = (TServiceClass)Activator.CreateInstance(typeof (TServiceClass), new[]{repository});
}
return serviceClass;
}
Sin embargo, esto es horrible por 2 razones: 1) Su depende fuertemente de la convención de nomenclatura, 2) Asumió el repositorio nunca tendrá constructores (no es verdadero) y el único constructor del servicio será su correspondiente repositorio (tampoco es cierto). Me dijeron "hey aquí es donde deberías usar un contenedor IoC, ¡sería genial aquí!" Y así comenzó mi investigación ... pero simplemente no lo veo y estoy teniendo problemas para entenderlo ...
¿Hay alguna manera en que ninject pueda resolver automáticamente los constructores de una clase sin una declaración específica tal que sería genial para usar en mi fábrica genérica (también me doy cuenta de que podría hacer esto manualmente utilizando la reflexión, pero eso es un golpe de rendimiento y ninject dice que en su página no usan el reflejo).
¡Sería muy útil aclarar este problema y/o mostrar cómo se podría usar en mi fábrica de genéricos!
EDIT: Respuesta
así que gracias a la explicación de abajo estaba hábilmente para entender completamente la maravilla de ninject y mi fábrica genérica se ve así:
public static class EntityServiceFactory
{
public static TServiceClass GetService<TServiceClass>()
where TServiceClass : class
{
IKernel kernel = new StandardKernel();
return kernel.Get<TServiceClass>();
}
}
bastante impresionante. Todo se maneja automáticamente ya que las clases concretas tienen un enlace implícito.
Comentario de registro de bits habitual: ejecute [Inyección de dependencia en .NET libro mi Mark Seemann] (http.commanning.com/seemann). No puedo imaginar que no te sientas seguro del por qué y cómo de DI (el patrón) y los contenedores DI en una semana después de ser el propietario del libro. –