2017-11-22 6 views
2

私のセットアップは、以下の通りである -クラス(CDI)を含むリファレンスを得ることは可能ですか?

public class ParentModel { 
    private StatusModel sm; 
} 

StatusModelクラスは以下の通りである - StatusModel内部

public class StatusModel { 
    private ParentModel pm; 

    public void setParentModel(ParentModel pm) { 
     this.pm = pm; 
    } 
} 

pmStatusModelが依存するParentModelインスタンスの基準となります。 daoインサイド

- 私は

@Inject 
private Instance<ParentModel> factory; 

以下のようにParentModelを注入したが、以下のように別々のメソッド呼び出しを使用してStatusModelParentModelの参照を設定しています -

pm = factory.get(); 
pm.setters... 
pm.getSm().setParentModel(pm);//<----- is it possible to avoid this? 

我々は内部pm参照を取得できますsmメソッド呼び出しなし?

+1

これは循環依存であるため、DIコンテナがオブジェクトの作成順序を正しく決定する明白な方法はありません。横方向の提案:しないでください。代わりに 'StatusModel'が必要とする機能を、それを' ParentModel'と 'ParentModel'の両方に注入できる新しいクラスに抽出します。 – millimoose

答えて

1

しかし、不完全に初期化された状態では、オブジェクトがコンストラクタパラメータとして別のオブジェクトに挿入され、そこでセッタを呼び出すことがあります。

class ParentModel { 
    StatusModel _status; 
    ParentModel(@Inject StatusModel status) { 
     _status = status; 
     _status.setParent(this); 
    } 
} 

class StatusModel { 
    ParentModel _parent; 
    void setParent(ParentModel parent) { _parent = parent); 
} 

、あなたはの素敵なツー持つプロパティを復元することができますので、私は、この循環依存のアップを壊すことをお勧めし、言った:あなたは後者のオブジェクトを解決する際に、全体オブジェクト階層は、一貫して無効なオブジェクトを作成することは不可能です。

関連する問題