2016-08-22 12 views
0

「タペストリーのしくみ」を理解することで、小さな問題が再び発生します。タペストリー:ランタイムに注入

私は(この場合の値エンコーダ)タペストリーコンポーネント持っ

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(); 
    } 
をこのことにより、casued

、私はこの醜いソリューションを使用するように強制しています:

@Inject 
private IEditionManager editionmanager; 
editionEncoder = new EditionEncoder(editionManager); 

をより良い方法はありますランタイム中にコンポーネントを注入するか、それとも一般的にはより良いソリューションですか?事前にあなたの助けのための

おかげで、できるだけ早くあなたが「新しい」はその後、タペストリー、IOCは、オブジェクトの作成に関与していない使用して注入することはできませんよう

答えて

0

。あなたはすべてを注入し、シングルトンサービスには "new"を使用しないでください。これは、tapestry-iocだけでなく、すべての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

関連する問題