Necesito inyectar el contexto EF por solicitud. ¿Hay alguna forma de implementarlo?ASP.NET MVC inyectar por solicitud
Respuesta
El solution proposed en la lista de Discusión de Unity consiste en crear un contenedor secundario por solicitud, hacer que ese contenedor secundario cree el contexto EF como ContainerControlledLifetime, y luego tener el contenedor hijo dispuesto al final de la solicitud. Al hacerlo, no tiene que crear un LifetimeManager personalizado.
No estoy muy familiarizado con la unidad pero el principio sería algo como esto:
Application_BeginRequest(...)
{
var childContainer = _container.CreateChildContainer();
HttpContext.Items["container"] = childContainer;
childContainer.RegisterType<ObjectContext, MyContext>
(new ContainerControlledLifetimeManager());
}
Application_EndRequest(...)
{
var container = HttpContext.Items["container"] as IUnityContainer
if(container != null)
container.Dispose();
}
Sí, he visto este patrón, uno similar se propuso para mi escenario en StructureMap (http://stackoverflow.com/questions/3665336/request-query-query-with-structuremap-ioc-how-do-i-plement- idisposable) con el que también estuviste involucrado. Al final, no tuve que hacer esto (afortunadamente, ya que no me gusta la idea de crear DC en el inicio/eliminación en el final). – RPM1984
¿De dónde viene _container? Creo que entiendo el concepto de Child Container, pero ¿cómo obtengo el padre al inicio de la solicitud? Creo que esto me puede ayudar en una situación similar – RobD
@RobD - El _container generalmente es inicializado por usted durante App_Start (arranque inicial del contenedor raíz). – PHeiberg
¿Qué quiere decir con la inyección? ¿Pretendes aplicar el principio de inversión de dependencia en él? En caso afirmativo, ¿alguna vez te imaginas intercambiando tu contexto EF con algún otro contexto que se adhiera al mismo contrato?
Para mí, debe encapsular el contexto EF en algún lugar del marco, de modo que cada solicitud reciba EF DataContext. Aplica DI en tu repositorio. Más adelante, sus repositorios pueden tener diferentes tipos de contextos y puede intercambiar repositorios entre sí.
¿Has echado un vistazo a this excelente blog en DI con Unity y ASP.NET MVC?
Debería llevarlo por el camino correcto.
La respuesta es sí, puede - y el artículo muestra cómo hacerlo.
En resumen, crea un HttpContextLifetimeManager para manejar el "alcance" de sus objetos. El contenedor "almacena en caché" la instancia en el contexto HTTP.
Esto es necesario porque los administradores de tiempo de vida predeterminados proporcionados por Unity no cubren el alcance del contexto HTTP "off the shelf".
Por supuesto, otros contenedores DI (como StructureMap, que uso), sí.
Here es otro artículo (más actualizado) sobre la misma cosa, con el "Nerdinner" como ejemplo.
Si ve la publicación que sugirió, allí está haciendo DI en el repositorio como he sugerido y está encapsulando DataContext en otro lugar. Y luego, dentro del método de depósito, el autor obtiene DataContext desde una ubicación central. – Pradeep
Vi su sugerencia, y estoy de acuerdo (también uso Repository/UoW). Sin embargo, esta no es una pregunta sobre los patrones de diseño: se trata de una cuestión de alcance del contexto para DI, con lo que espero que mi respuesta me ayude. – RPM1984
+1 - Sugerencias y artículos agradables. Me gusta StructureMap construido en el alcance de HttpContext y esto va sobre el problema de la misma manera. – PHeiberg
- 1. inyectar un MembershipProvider en ASP.Net MVC AccountController
- 2. ASP.NET MVC, Ninject, instancia única por solicitud de múltiples constructores
- 3. Filtros de solicitud de ASP.NET MVC
- 4. SmtpClient.SendAsync bloqueando mi ASP.NET MVC Solicitud
- 5. ¿MvcMailer SendAsync bloquea una solicitud ASP.NET MVC?
- 6. Detectar una solicitud cancelada en ASP.NET MVC
- 7. ASP.NET MVC> ASP.NET WebForms, ¿Por qué?
- 8. ASP.NET MVC. Subdominios conducidos por datos?
- 9. por solicitud de datos estáticos en ASP.NET
- 10. debe formcollection estar vacío en asp.net mvc solicitud GET
- 11. ASP.net MVC - variable global con ámbito de solicitud
- 12. asp.net mvc - necesito almacenar algunos datos para la solicitud actual
- 13. ASP.NET MVC inyección IPrincipal personalizada
- 14. Manejo de solicitud de Async en ASP.NET MVC
- 15. ASP.NET MVC: Aplicar la solicitud AJAX en una acción
- 16. ASP.NET MVC: ¿Se creó el controlador para cada solicitud?
- 17. cómo saber si la solicitud es ajax en asp.net mvc?
- 18. ASP.NET MVC - Generar rutas sin Http/Contexto de solicitud
- 19. Obtener la solicitud en bruto en ASP.NET MVC
- 20. NHibernate Profiler no ve solicitud de mi aplicación ASP.NET MVC
- 21. ASP.NET MVC 2 VirtualPathProvider GetFile cada vez para cada solicitud
- 22. Solicitud de certificado de cliente con Asp.net MVC
- 23. ¿Por qué se eliminó la solicitud de validación de ASP.net MVC?
- 24. ¿Por qué la llamada abort() en la solicitud ajax causa un error en ASP.Net MVC (IE8)
- 25. Deshabilitar el estado de la sesión por solicitud en ASP.Net MVC
- 26. ASP.NET MVC3 Concesionario de validación exitoso varias veces por solicitud
- 27. asp.net mvc área de página por defecto
- 28. números separados por coma con asp.net mvc
- 29. asp.net mvc: simulando AutoPostBack por simple casilla
- 30. Ejemplo de Windows Identity Foundation Solicitud MVC
¿Está utilizando la Unidad u otro contenedor IoC? – jgauffin
Sí, uso Unity – SiberianGuy