Я разрабатываю большое приложение, используя те же вещи: MEF и PrismV4
Я управляю выключением немного по-другому:
в командной консоли, есть область «Инструменты», отключение для этогообрабатывается прямо в командной консоли, при событии закрытия.
Затем для всего, что введено в другом регионе, который является tabcontrol, я преобразую содержимое как IDisposable и закрываю каждую вкладку одну за другой.(На самом деле, это не tabcontrol, это компонент avalondock, но на самом деле это одно и то же).
Конечно, вам нужно будет реализовать IDisposable для каждого класса, который имеет ссылки и т. Д., Но трудно придумать«чистый способ выключения» без осмысления этого интерфейса, верно?=)
Теперь о EventAggregator: у вас могут возникнуть проблемы, потому что нет связи: вы можете запустить слабое событие через него, но вы не можете ждать, пока объекты выполнят свою работу послечто.
И затем, вы не можете создать механизм для отмены выключения.
Если вы хотите, чтобы ваши различные представления могли отменить выключение, я предлагаю вам создать интерфейс с однимметод в нем:
public interface IShutdownAware
{
bool CanShutdown();
}
Затем, перед вызовом dispose, вызовите CanShutdown();
, если все они возвращают true, продолжите удаление, в противном случае отмените процесс завершения работы.