2010-09-25 15 views
7

Me gustaría tener mis propios contextos para algunos proyectos basados ​​en CDI. Necesito (quiero) ámbitos personalizados para poder aislar cuánto tiempo vive un componente y dónde.CDI - Escritura de contextos y ámbitos personalizados

Para implementar su propio contexto, debe implementar la interfaz Context que se explica por sí misma, pero ¿cómo o dónde definir realmente cuándo se crea?

Respuesta

4

No he probado esto todavía, pero creo que esto funcionará. Para cada encargo alcance/contexto que desea en su aplicación, sólo hay que añadir que el contexto a través de una extensión cuando el contenedor se inicializa:

public void afterBeanDiscovery(@Observes AfterBeanDiscover afterBeanDiscovery, BeanManager beanManager) 
{ 
    CustomContext customContext = new CustomContext(); 
    afterBeanDiscovery.addContext(customContext); 

    beanManager ... 
} 

Ahora, el truco es, es necesario mantener una referencia a ese contexto Entonces, cuando quieras comenzar o detenerlo, puedes. Eso sería algo así como:

@Inject 
protected HttpRequestLifecycle httpRequestLifecycle; 

public void doSomething() 
{ 
    startContext(); 
    doStuff(); 
    stopContext(); 
} 

public void startContext() 
{ 
    httpRequestContextLifecycle.getHttpRequestContext().activate(); 
} 

Eso debería hacerlo, no hay una gran cantidad de documentación por ahí, así que espero que esto ayude.

Cualquier persona interesada, echa un vistazo a la fuente aquí: http://github.com/walterjwhite/server.web.application

Walter

+0

En realidad, esto me hizo muy cerca. Incluso después de iniciar el contexto al establecerlo activo, sigo recibiendo No Contexts Active para el ámbito ... –

+0

Otra nota aquí: no puede insertar el contexto a menos que lo convierta en un singleton. Si tiene un ámbito de aplicación, no tiene garantía de que obtendrá el mismo contexto que está en el mapa de contextos. Eso significa que el contexto que activa es un contexto ficticio, no controla nada. Lo que terminé haciendo fue mantener una referencia en mis clases de administración del ciclo de vida y luego inyectar ese ciclo de vida y obtener el contexto. –

+2

Si fuera @Singleton, ¿cómo diferenciaría varias solicitudes? ¿No deberías crear y activar el contexto en algún lugar del oyente de contexto? –

Cuestiones relacionadas