こんにちは私は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(閉じる)ボタンをクリックしてください)閉じます。
これはどのように殺す/この肛門を破壊する存在ですか?
はい、オブジェクトはコンテナが廃棄されるまで決して解放されませんが、これはかなりの制限です。 –