2011-07-08 12 views
15

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?

Respuesta

11

¿Desea una única instancia de cada uno de sus servicios de repositorio para toda la aplicación? Si es así, entonces use InSingletonScope.

¿Su aplicación de consola es multiproceso? Si este es el caso y desea una nueva instancia de sus servicios para cada hilo, entonces usará InThreadScope.

Si desea una nueva instancia del servicio (s) cada vez que se solicite, configúrelo en InTransientScope.

También tiene la opción de definir su propio alcance utilizando InScope. Bob Cravens ofrece una buena descripción de cada uno de estos aquí http://blog.bobcravens.com/2010/03/ninject-life-cycle-management-or-scoping/

+0

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

+0

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 –

+0

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

Cuestiones relacionadas