c# - Cuándo usar Singleton vs Transient vs Request con Ninject y MongoDB
asp.net-mvc norm (3)
No estoy muy seguro de cuándo debo usar SingletonScope () vs TransientScope () vs RequestScope () cuando hago mi enlace en mi archivo global.cs.
Tengo, por ejemplo, mi llamada a MongoSession (utilizando NoRM y el proyecto mvcStarter http://mvcstarter.codeplex.com/ ) que está configurado para SingletonScope pero creé un repositorio que usa este objeto MongoSession para hacer llamadas a Mongo más fácil, por ejemplo Tengo un NewsRepository que utiliza MongoSession para recuperar mis elementos de Noticias de los datos. Como ejemplo, tengo una llamada que obtiene elementos de noticias que tienen DisplayOnHome establecido en verdadero y obtienen lo último de CreationDate. ¿Debería dicho repositorio ser SingletonScope o sería más apropiado RequestScope?
¿Cuándo debo usar cada uno de ellos y por qué?
De la pregunta eliminada según lo solicitado por @shankbond arriba
La Dispos
al no se realiza necesariamente de forma sincrónica en el subproceso de solicitud principal, como se podría suponer.
Probablemente desee guardar un Block
y luego Dispose()
en una fase apropiada de su solicitud (¿cómo va a manejar las excepciones?)
Eche un vistazo a los Ninject Tests para ver más ejemplos (en serio, vaya, sean cortos y claros, ¡y no me arrepentí cuando escuché la 3ª vez que me dijeron que lo hiciera!)
Consulte http://kohari.org/2009/03/06/cache-and-collect-lifecycle-management-in-ninject-20/
En general, en una aplicación web, desea que el estado sea el alcance de solicitud tanto como sea posible.
Solo en el caso de optimizaciones de muy bajo nivel, es probable que alguna vez te encuentres con un caso en el que sea apropiado crear objetos singleton (y es probable que incluso entonces extraigas esa lógica de almacenamiento en caché / compartimiento en otra clase que se obtiene como una dependencia de sus otros objetos de [alcance de solicitud] y haga ese alcance de singleton). Recuerde que un singleton en el contexto de una aplicación web significa múltiples hilos que utilizan los mismos objetos. Esto rara vez es una buena noticia.
En la misma base, el alcance transitorio es el valor predeterminado más directo (y por eso Ninject 2 lo hace así): el alcance de solicitud solo debe entrar en la ecuación cuando se debe compartir algo por razones de rendimiento, etc. (o porque es simplemente el contexto). del intercambio [como se menciona en la otra respuesta]).
Supongo que la respuesta dependerá de si su MongoSession
representa una unidad de trabajo o no. La mayoría de las clases relacionadas con la base de datos con las que he trabajado (principalmente en el contexto de ORM, como NHibernate o EF4) giran en torno a un contexto, entidades y estado rastreado que representan una unidad de trabajo . Una unidad de trabajo nunca debe mantenerse alrededor del tiempo requerido para realizar la unidad de trabajo dada, después de lo cual la unidad debe comprometerse o retrotraerse. Eso significaría que debes usar RequestScope
.
Si su MongoSession
no es una unidad de trabajo, puede mantenerlo durante toda la vida de una sesión de MVC, en cuyo caso SessionScope
sería apropiado.