2011-01-31 17 views
5

Francamente soy un novato tanto en C# como en Asp.net MVC. Tampoco sé cómo la aplicación web asp.net realmente funciona en el marco IIS y ASP.NET detrás de la escena.Campo estático de DbContext en Global.asax frente al campo de instancia de DbContext en la clase de controlador?

Estoy confundido con la decisión donde tengo que declarar un campo de DbContext (o cualquier clase derivada de DbContext) en mi aplicación asp.net mvc.

que tienen dos opciones:

  1. declarar el campo como un campo estático dentro global.asax de tal manera que todos los controladores pueden hacer uso de ella.
  2. Declare el campo como un campo de instancia dentro de cada clase de controlador.

¿Podría explicar cuál es la correcta? Se necesita una explicación más detallada.

Respuesta

8

Si lo convierte en un campo estático en global.asax, se encontrará con problemas de concurrencia. Múltiples hilos de múltiples solicitudes pueden entrar y obtener los datos de los demás. Lo que es peor es que esto no se mostrará hasta que empiece a recibir más tráfico en su sitio web, o hasta que comience la prueba de carga. Lo implementará como singleton, todo estará funcionando bien en sus pruebas, y pensará: "¡Soy un genio! ¡Mira qué tan limpia es esta implementación!" Pero algún día, serás quemado por esto, como lo he estado yo. Los resultados se mezclarán, los usuarios comenzarán a ver datos que no les pertenecen y el sitio web se comportará de forma inesperada.

Las clases de contexto para Entity Framework y LINQ to SQL fueron diseñadas para ser una creación de instancias ligera, algo que configura para cada conjunto de consultas que desea ejecutar. No debe durar mucho tiempo.

Check out this other Stack Overflow question/answer on the same topic, worded differently.

4

Debe ir con la segunda opción. es decir, declararlo y usarlo en el controlador. Si coloca DBContext como un campo estático en global.asax, básicamente lo está convirtiendo en una sola instancia para toda la aplicación.

Por otro lado, con la segunda opción tiene un DBcontext para cada solicitud. Sería mejor si puede usar una inyección de dependencia para obtener el DBContext en cada método de acción.

+0

lo que es el inconveniente si hago uso de una única instancia de DbContext (o clase derivada de DbContext) para toda la aplicación? – LaTeX

+2

@Stack Overflow: lee en "singletons" en términos de conexiones de bases de datos, y por qué es malo. – RPM1984

Cuestiones relacionadas