2011-01-02 15 views
1

こんにちは私はMEFとcaliburn.microをWPFアプリケーションで使用しています。私はMEFで作られた霊器をどのように破壊することができるのかを知りたい。例えばMEFでオブジェクトを作成する方法

単純なシェル:

[Export(typeof(IShellViewModel))] 
    public class ShellViewModel : Conductor<IScreen>.Collection.OneActive, IShellViewModel 
    { 

     protected override void OnInitialize() 
     { 
      ShowLogOn(); 
      base.OnInitialize(); 
     } 

     //first screen 
     public void ShowLogOn() 
     { 
      var vm = IoC.Get<ILogOnViewModel>(); 
      ActivateItem(vm); 
     } 

     //second screen 
     public void ShowMessenger(Account account) 
     { 
      ActiveItem.Deactivate(true); 
      var vm = IoC.Get<IMessengerViewModel>(); 
      vm.Account = account; 
      ActivateItem(vm); 
     } 

    } 

最初の画面

[Export(typeof(ILogOnViewModel))] 
public class LogOnViewModel : Screen,ILogOnViewModel 
{ 
    User user=new User(); 
} 

第2のスクリーン:

[Export(typeof(IMessengerViewModel))] 
      public class MessengerViewModel : Screen, IViewModelIdentity, 
       IMessengerViewModel, IHandle<Rp>, IHandle<string> 
      {..} 

WPF appは、ILogOnViewModelインターフェイスに関連付けられた最初の画面から開始します。次に、この画面を無効にして、IMessengerViewModelインターフェイスに関連付けられた2番目の画面をアクティブにします。

私はメモリ使用量をANTS Mememoryプロファイラーでチェックしますが、ILogOnViewModelのインスタンスは、ユーザーが生きているクラスのインスタンスでもまだ生きています。

私はIoC、DIで初心者です... MEFでエクスポートされるすべてのクラスは、WPFアプリケーションライフタイムサイクル全体で生きていなければなりませんか?

他の例では、ウィンドウマネージャを使用して新しいwpfウィンドウを作成します。

[Export(typeof(IChatViewModel))] 
[PartCreationPolicy(CreationPolicy.NonShared)] 
public class ChatViewModel : Screen, IViewModelIdentity, 
    IChatViewModel, IHandle<Rp>, IHandle<DetailData> 
{} 

ChatViewModelはWPF Windowです。

がIChatViewModelのインスタンスを作成します。

private IWindowManager _windowManager; 
var chatScreen = IoC.Get<IChatViewModel>(); 
_windowManager.Show(chatScreen); 

をそれから私は、WPFウィンドウ、ChatViewModelが を無効ますが、このクラスのinstaceがまだ生きているされる(画面上のX(閉じる)ボタンをクリックしてください)閉じます。

これはどのように殺す/この肛門を破壊する存在ですか?

答えて

1

MEFコンテナがあなたの輸出の寿命を管理する責任があるので、関係なく、CreationPolicyたの(デフォルトはSharedである)が使用され、コンテナのDisposeメソッドへの最後の呼び出しが(どのラップあなたの実際のクラスの任意Exportインスタンスを処分しますインスタンス)。またExportインスタンスでDisposeを呼び出すと、実際のクラスインスタンスも破棄されます。参照は、それが勝った(Exportに包ま)MEF CompositionContainerによって維持されているので

覚えておくべきことは、GCは、オブジェクトグラフを見て、その特定のインスタンスに0以上の参照があるかどうかを決定されますそのアイテムを処分しないでください。

プラグインにIDisposableが実装されているとします。

public interface ILogOnViewModel : IDisposable { } 

そして処分パターンを実装する場合、あなたはそれを複数回呼び出すことができるようにすることを確認してください。

public void Dispose(bool disposing) 
{ 
    if (disposing && !disposed) 
    { 
     // Clean up? 
    } 
} 

public void Dispose() 
{ 
    Dispose(true); 
    GC.SurpressFinalize(this); 
} 

あなたはその後、無事時に問題を引き起こすことなく、あなたのILogOnViewModel実装のインスタンスにDisposeを呼び出すことができます実際のコンテナは廃棄されます。

+0

はい、オブジェクトはコンテナが廃棄されるまで決して解放されませんが、これはかなりの制限です。 –

関連する問題