4

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

最近、Caliburn ブートストラッパーがルートの Autofac コンテナーから依存関係を解決することに気がつきました。したがって、これらの依存関係 (たとえば、グリッドにバインドされる数千のデータ項目を持つビュー モデル) は破棄されません。

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

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

WPFフォームが閉じられたときに依存関係を破棄する方法について、誰かに推奨事項/提案はありますか?

4

1 に答える 1

1

私は現在、Castle から解決されたビュー モデルをリリースするために以下を使用しています (より良いものが登場するまで!)。私は 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...
        }
    }
于 2012-05-01T23:44:26.547 に答える