2010-10-10 19 views

Respuesta

5

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(); 
} 
+0

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

+0

¿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

+0

@RobD - El _container generalmente es inicializado por usted durante App_Start (arranque inicial del contenedor raíz). – PHeiberg

1

¿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í.

6

¿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 , 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.

+0

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

+0

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

+0

+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

Cuestiones relacionadas