2016-08-22 2 views
0

"태피스트리 작동 방식"을 이해하면 작은 문제가 다시 발생합니다.Tapestry : 런타임시 삽입

내가 (이 경우 값 인코더)를 태피스트리 구성 요소에있어

:

public class EditionEncoder implements ValueEncoder<Edition>, ValueEncoderFactory<Edition> { 

    @Inject 
    private IEditionManager editionDao; 

    public EditionEncoder(IEditionManager editionDao) { 
     this.editionManager = editionDao; 
    } 

    @Override 
    public String toClient(Edition value) { 
     if(value == null) { 
      return ""; 
     } 
     return value.getName(); 
    } 

    @Override 
    public Edition toValue(String clientValue) { 
     if(clientValue.equals("")) { 
      return null; 
     } 
     return editionManager.getEditionByName(clientValue); 
    } 

    @Override 
    public ValueEncoder<Edition> create(Class<Edition> type) { 
     return this; 
    } 
} 

인코더가 같은 페이지 내에서 생성되기 때문에, 관리자가 작동하지 않는 주입 :

public void create() { 
     editionEncoder = new EditionEncoder(); 
    } 
@Inject 
private IEditionManager editionmanager; 
editionEncoder = new EditionEncoder(editionManager); 

이 더 나은 방법이 있나요 : 이것에 의해 casued

, 난이 추한 솔루션을 사용하도록 강요하고 있습니다 런타임 중에 컴포넌트를 삽입하거나 일반적으로 더 나은 솔루션이 있습니까? 사전에 도움을

감사합니다, 최대한 빨리 "새"가 다음 태피스트리 - IOC가 객체 생성에 관여하지 않습니다 사용하여 주입 할 수 없기 때문에

답변

0

. 당신은 모든 것을 주입해야하며 싱글 톤 서비스에는 결코 "새로운"것을 사용해서는 안됩니다. 이는 태피스트리 (tapestry)뿐 아니라 모든 ioc 컨테이너에 적용됩니다.

또한 필드에 @Inject를 넣으면 설정을 위해 생성자가 필요하지 않습니다. 둘 중 하나를 수행하십시오.

당신은 같은 것을해야한다 : 페이지/컴포넌트/서비스 그리고

public class MyAppModule { 
    public void bind(ServiceBinder binder) { 
     binder.bind(EditionEncoder.class); 
    } 
} 

당신이 거기에 자신의 인스턴스 객체를 넣어 원하는 경우

@Inject EditionEncoder editionEncoder; 

당신이 할 수

public class MyServiceModule { 
    public void bind(ServiceBinder binder) { 
     binder.bind(Service1.class, Service1Impl.class); 
     binder.bind(Service2.class, Service2Impl.class); 
    } 
    public SomeService buildSomeService(Service1 service1, Service2 service2, @AutoBuild Service3Impl service3) { 
     Date someDate = new Date(); 
     return new SomeServiceImpl(service1, service2, service3, someDate); 
    } 
} 
+0

yip, 그건 분명합니다. 예 : 봄에는 수동으로 인스턴스화 된 객체를 사용하여 주입 메커니즘을 "강제"할 수 있습니다. 나는 비슷한 방법을 찾고 있는데, 나는 '생성자의 주장'을 좋아하지 않는다. – user3066027