2012-05-01 15 views
4

クリックすると、WPFフォームを表示するWinformsメニュー項目があります。 WPFフォームは、AutofacでブートストラップされたCaliburn Microを使用します。Caliburn Microで使用するAutofacコンテナの処理方法

最近、キャリバーブートストラップがルートAutofacコンテナからの依存関係を解決したことが私にはたった今起こりました。したがって、これらの依存関係(例えば、グリッドに結合されるデータ項目の1000を有するビューモデル)は決して処理されない。

私は、Autofacライフタイムスコープのコンテナを使用して処分を管理したいと思いますが、私はCaliburnでこれを行う方法がわかりません。最初は、開かれた各WPFフォームに対して1つのCaliburnブートストラップ(インスタンスには独自のAutofacライフタイムスコープコンテナを使用)をインスタンス化すると考えました。次に、フォームが配置されるとき、ブートストラップを配置することができ(およびライフタイム・コープ・コンテナにそれを配置することができる)。

しかし、Caliburnソースを見ると、アプリケーション全体に対して1つのブートストラップしか作成されていないようです。これは、ブートストラップをインスタンス化すると、静的フィールドにUIマーシャリング(および私が見たことのないその他のもの)を割り当てるように思えるからです。

WPFフォームが閉じられたときに、依存関係をどのように処分することができるかに関する推奨事項や提案はありますか?

+0

私は城に関連して同様の質問をしました。 http://stackoverflow.com/q/9583760/246811。まだ実用的な答えはありませんでした。 –

+0

質問をする前にあなたの投稿を見ました。あなたと同じように、私はVMを汚染することなくこれを行う方法を探しています。さらに、なぜこのオンラインに関する情報がまだないのか分かりません。キャリバーン(少なくとも2つの人気のあるDIフレームワークであるAutofacとCastleでは、かなり大きな問題のようです)。 –

+0

同意します。ライフサイクルの問題を伴うVMの汚染は、私が暮らすことができるものではありませんでした。 –

答えて

1

現在、城から解決されたビューモデルをリリースするために、以下を使用しています。私はAutoFacに慣れていませんが、おそらくこのアプローチが役に立つかもしれません。あなたのブートストラップで:

protected override object GetInstance(Type serviceType, string key) 
{ 
     // Get the instance from the container 
     ... 

     // If it's activatable, monitor it so we can release when closed. 
     IDeactivate activatable = result as IDeactivate; 
     if (activatable != null) 
     { 
      activatable.Deactivated += activatable_Deactivated; 
     } 
     return result; 
} 

    void activatable_Deactivated(object sender, DeactivationEventArgs e) 
    { 
     if (e.WasClosed) 
     { 
      ((IDeactivate)sender).Deactivated -= activatable_Deactivated; 
      container.Release(sender); // or whatever AutoFac equivalent is... 
     } 
    } 
+1

お世話になりました。残念ながら、私はこれがオートファックではうまくいかないと思います。 Autofacのライフサイクル管理アプローチは、作業単位が完了したときに処分できる子コンテナを作成することを中心にしています。これは、ブートストラップがどの子コンテナから依存関係を解決するか、どの子コンテナを破棄するかを知る必要があることを意味します。私は、Autofacがコンテナをサポートしているかどうかをまだチェックしていません。ルートコンテナからスタイルメソッドを解放してください。 –

関連する問題