Tengo una solución MVC 3 configurada con Ninject utilizando un patrón de repositorio. Algunos de mis fijaciones incluyen:Configurar Ninject para una aplicación de consola y aprovechar el repositorio existente para mi aplicación MVC
kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InRequestScope();
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
kernel.Bind<IMyRepository>().To<MyRepository>().InRequestScope();
kernel.Bind<IMyService>().To<MyService>().InRequestScope();
kernel.Bind<ILogging>().To<Logging>().InSingletonScope();
También he añadido una aplicación de consola a mi solución y quiero aprovechar el mismo repositorio y servicios. Mi configuración Ninject para la aplicación de consola se ve así:
kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InSingletonScope();
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InSingletonScope();
kernel.Bind<IMyRepository>().To<MyRepository>().InSingletonScope();
kernel.Bind<IMyService>().To<MyService>().InSingletonScope();
kernel.Bind<ILogging>().To<Logging>().InSingletonScope();
Mi código de la consola se ve así:
static void Main(string[] args)
{
IKernel kernel = new StandardKernel(new IoCMapper());
var service = kernel.Get<IMyService>();
var logger = kernel.Get<ILogging>();
... do some processing here
}
Esto funciona muy bien, pero yo quiero t estar seguro de que estoy configurando Ninject correctamente para una aplicación de consola . ¿Es correcto usar InSingletonScope() para todos mis enlaces en mi aplicación de consola? ¿Debo configurarlo de otra manera?
La aplicación de consola tiene un bucle for simple que itera a través de unas pocas URL, raspa el contenido, lo procesa y lo pasa a los servicios para guardarlo en la base de datos. ¿No hay solicitudes de sincronización, así que supongo que esto lo hará de un solo subproceso? ¿Qué enfoque se adapta mejor a este escenario? – Thomas
Si desea usar la misma conexión de base de datos cada vez, puede usar InSingletonScope o InRequestScope. Para una operación sincrónica que debería estar bien. Si por alguna razón sus solicitudes al servicio de la base de datos se vuelven asíncronas (lo cual es común en los escenarios de UoW), entonces puede comenzar a tener problemas con la conexión de la base de datos utilizada por dos llamadas diferentes al mismo tiempo. Esto me sucedió hace varios meses y me paso días intentando descubrir qué estaba pasando –
Cuando dices "tus solicitudes para el servicio de la base de datos se vuelven asíncronas", asumo que realmente tengo que modificar mi código para "volverme asíncrono" o esto algo que puede ocurrir "debajo del capó"? – Thomas