2010-09-25 4 views
7

Я хотел бы иметь свои собственные контексты для некоторых проектов на основе CDI. Мне нужны (нужны) пользовательские области, чтобы я мог изолировать, как долго живет компонент и где.CDI - Написание пользовательских контекстов и областей

Чтобы реализовать свой собственный контекст, вам необходимо реализовать интерфейс Context, который довольно понятен, но как и где вы действительно определяете, когда он создается?

ответ

4

Я еще не проверял это, но я считаю, что это сработает. Для каждого настраиваемой области/контекста вы хотите в вашем приложении, вам просто нужно добавить, что контекст с помощью расширения при инициализации контейнера:

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

    beanManager ... 
} 

Теперь, хитрость заключается в том, что вам нужно держать ссылку на этот контекст поэтому, когда вы хотите начать или остановить его, вы можете. Это было бы примерно так:

@Inject 
protected HttpRequestLifecycle httpRequestLifecycle; 

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

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

Это должно быть сделано, там нет большого количества документации, поэтому я надеюсь, что это поможет.

Любой заинтересованный, проверить источник здесь: http://github.com/walterjwhite/server.web.application

Walter

+0

На самом деле, это у меня очень близко. Даже после того, как я запустил контекст, установив его активным, я все еще получаю No Contexts Active для области ... – 2010-09-26 21:52:28

+0

Другое примечание здесь - вы не можете вставлять контекст, если только вы не сделаете его одиночным. Если это область приложения, у вас нет гарантии, что вы получите тот же контекст, что и в карте контекстов. Это означает, что контекст, который вы активируете, является фиктивным контекстом, он ничего не контролирует. То, что я закончил, было ссылкой на него в моих классах управления жизненным циклом, а затем впрыском этого жизненного цикла и получения контекста. – 2010-09-28 12:41:03

+2

Если бы это было @Singleton, как бы вы различали несколько запросов? Разве вы не должны создавать и активировать контекст где-нибудь в контекстном прослушивателе? –