2011-11-14 6 views
1

に大きな依存関係の範囲を管理し、私はおおよそ次のようになりますシングルトンとしてninjectによって管理されているクラスがあります:私はIInitialiserが(実際にすべてがコンテナ管理されている)Iocを経由してsuppied持っninject

class InMemoryDb 
{ 
    IInitialiser _initialiser; 
    SomeBackingStore _store; 

    InMemoryDb(IInitialiser initialiser) 
    { 
     _initialiser = initialiser; 
    } 

    void Init() 
    { 
     //once init'd i don't care what happens to the _initialiser field 
     _store = _initialiser.Initialise(); 
    } 
} 

を。私の問題は、いったん初期化されると、_initialiserオブジェクトはガベージコレクションされません(なぜなら、それはTechinically InMemoryDbシングルトンオブジェクトによって参照されているためです)、アプリケーションを消費するメモリ内に座っています(5gig以上です)。どのようにしてオブジェクトをきれいに整理して、オブジェクトをIOC経由で配線し、使用後に処分することができますか?基本的に初期化されると、そのオブジェクトを処分することが安全であることが確信できます。 init()メソッドの実行が完了、それは私のコードは、テスト不能になりたら、それは範囲外であるとして、これは最終的にGCによってクリーンアップを取得します

void Init() 
{ 
    _store = new Initialiser().Initialise(); 
} 

:残念ながら、私がこれまでに頼ってきた

それについてのにおいがあります。

また、これはServiceLocator呼び出しで自分のコードを調べるので理想的ではありません。

これをより良く構築する方法についてのご意見はありますか?

答えて

2

それが、この方法ではなく、コンストラクタ・インジェクションを使用しての引数としてそれを取る持っているために、より理にかなって初期化が必要で唯一Init方法ですので:

class InMemoryDb 
{ 
    SomeBackingStore _store; 

    void Init(IInitialiser initialiser) 
    { 
     _store = initialiser.Initialise(); 
    } 
} 

それからの呼び出し側の責任でありますイニシャライザを提供するInitメソッド。また、Initメソッドが呼び出されたかどうかを示すブール型isInitializedフィールドを使用することもできます。このフィールドは、_storeフィールドに依存する可能性のある他のメソッドによって使用され、フィールドが適切に初期化されていることを確認します。

+0

ありがとうございました。単純な解決策のように聞こえる – AaronHS