Привет Я использую 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();
}
Второй экран:
[Export(typeof(IMessengerViewModel))]
public class MessengerViewModel : Screen, IViewModelIdentity,
IMessengerViewModel, IHandle<Rp>, IHandle<string>
{..}
WPF начало приложения с первого экрана, связанного с интерфейсом ILogOnViewModel. Затем я деактивирую этот экран и активирую второй экран, связанный с интерфейсом IMessengerViewModel.
Я проверяю использование памяти с помощью ANTI Mememory profiler, но instace из ILogOnViewModel все еще жив и нестабилен для класса. Пользователь жив.
Я новичок в IoC, DI ... все классы, которые экспортируются с помощью MEF, должны жить в течение всего цикла жизненного цикла приложения WPF?
Другой пример: я создаю новое окно wpf с оконным менеджером.
[Export(typeof(IChatViewModel))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class ChatViewModel : Screen, IViewModelIdentity,
IChatViewModel, IHandle<Rp>, IHandle<DetailData>
{}
ChatViewModel - это окно WPF.
Создать экземпляр IChatViewModel:
private IWindowManager _windowManager;
var chatScreen = IoC.Get<IChatViewModel>();
_windowManager.Show(chatScreen);
Тогда я закрываю (нажмите на кнопку X (закрыть) в окне) WPF Window, ChatViewModel деактивируется но instace этого класса все еще жив.
Он существует, как убить/уничтожить эти шрамы?
Да, но объект никогда не освобождается до тех пор, пока контейнер не будет установлен, что является довольно ограниченным. –