asp.net-mvc - started - entity framework tutorial
Comparta DbContext a través de repositorios en la aplicación web MVC (2)
Me gustaría una combinación entre las dos primeras opciones y con respecto a su opinión sobre la primera opción, no permita que los repositorios guarden ningún cambio (esa no es la forma recomendada de hacer las cosas, Martin Fowler dice que él mismo) y por eso presentó El patrón de unidad de trabajo.
Pregunta
¿Cuál es la forma correcta de compartir un EF DbContext en múltiples repositorios en una aplicación web MVC? ¿Es prudente / necesario hacerlo, cuáles son los inconvenientes de hacer o no hacer esto?
Fondo
Asumir:
- App.MvcSite (varias docenas de controladores, áreas múltiples, etc.)
- App.Services (capa de servicio, muchos servicios)
- App.Data (muchos repositorios, etc)
- ... etc., excluidos por simplicidad (Código EF, primero el último)
Investigación hasta la fecha
Parece que encuentro al menos dos / tres escuelas de pensamiento en SO y las redes.
- Comparta / amplíe su DbContext a la Solicitud para que una sola solicitud tenga un único DbContext compartido por todos los repositorios.
- Comparta / alcance su DbContext en la capa de servicio : el servicio mantiene un único DbContext y lo pasa a cada repositorio según sea necesario.
- No comparta un DbContext, ya que son baratos, deje que cada Repo tenga su propio.
En un sitio web pequeño, este no es un problema, por lo que la mayoría de los ejemplos de MS y de la comunidad simplemente no abordan este tema.
En mi experiencia hasta ahora no he usado repositorios finitos. Siempre he tenido servicios usando un DbContext y lo cambio directamente, así que no tenía que preocuparme por esto. Me han dicho que hay un gran beneficio para los repositorios finitos desde una perspectiva de prueba de unidad ... veremos si el resto vale la pena.
Mis pensamientos
(1) Comparta / alcance su DbContext a la Solicitud
Esto es interesante, ya que evita inteligentemente la trampa de un contexto de singleton que algunos desarrolladores creen que es la respuesta, pero encontrar que DbContext no funciona de esa manera. Pero parece tener un inconveniente ya que asume que todos los repositorios, servicios, etc. estarán coordinados en toda la solicitud ... a menudo no es así, ¿verdad? ¿Qué sucede si los cambios se guardan en un repositorio antes de que otro complete su trabajo? (externo (interno (interno)))
(2) Comparta / alcance su DbContext en la capa de servicio
Esto tiene más sentido para mí porque cada servicio debería coordinar una unidad específica de trabajo (intencional de minúsculas). Por lo tanto, si se usaran múltiples servicios en una solicitud, sería correcto (si no fuera necesario) que cada uno tuviera su propio contexto en la base de datos.
(3) No comparta un DbContext, ya que son baratos
Esta es la forma en que siempre lo he hecho ... bueno, en realidad casi siempre solo tuve un DbContext por solicitud porque solo se estaba llamando a un servicio. A veces pueden ser dos porque un controlador que estaba coordinando el trabajo llamó a dos servicios. Pero dada mi aplicación actual, con muchos repositorios finitos, cada repositorio que tenga su propio contexto significaría que una solicitud dada podría tener de 3 a 10 instancias de DbContext. Asumo (quizás incorrectamente) que esto es problemático.
Repitiendo la pregunta:
¿Cuál es la forma correcta de compartir un EF DbContext en múltiples repositorios en una aplicación web MVC? ¿Es prudente / necesario hacerlo, cuáles son los inconvenientes de hacer o no hacer esto?
-
DbContext
son baratos, pero las transacciones distribuidas no lo son. - Los objetos adjuntos a un contexto no se pueden usar en otro contexto (si tiene relaciones de objeto)
La forma más fácil de compartir un contexto es comenzar a usar una inversión del contenedor de control: http://www.codeproject.com/Articles/386164/Get-injected-into-the-world-of-inverted-dependenci