Изящное завершение работы приложения с использованием WPF PRISM 4 - PullRequest
5 голосов
/ 03 декабря 2011

Я ищу «лучшую практику» (если есть даже лучшую) для точного завершения работы приложения WPF, использующего MEF и PRISM4.В конечном счете, я ищу какой-то «закрытый сервис», который будет управлять всеми событиями / командами из командной консоли для любой модели представления (или других подписчиков), которые хотят убедиться, что все в порядке, чтобы закрыть приложение.Является ли агрегатор событий самым чистым способом?Другие мнения / варианты?

В идеале, у меня должна быть кнопка на панели инструментов в моей панели инструментов (1 из 2 регионов в моей оболочке).Эта кнопка вызовет команду на моей панели инструментов ToolbarViewModel (ссылается на команду на панели инструментов), которая, в свою очередь, сделает 2 вещи (я думаю?) ... Во-первых, уведомите всех подписчиков, что время закрытия, и разрешите любому из них отменить закрытие.и ... во-вторых, если никто не отменяет, как-то уведомить оболочку о закрытииРежим выключения моего приложения установлен на «ShutdownMode.OnMainWindowClose», поэтому, если оболочка закрывается, у меня все должно быть в порядке.

Может кто-нибудь помочь мне с этим?

1 Ответ

3 голосов
/ 30 декабря 2011

Я разрабатываю большое приложение, используя те же вещи: MEF и PrismV4

Я управляю выключением немного по-другому:
в командной консоли, есть область «Инструменты», отключение для этогообрабатывается прямо в командной консоли, при событии закрытия.
Затем для всего, что введено в другом регионе, который является tabcontrol, я преобразую содержимое как IDisposable и закрываю каждую вкладку одну за другой.(На самом деле, это не tabcontrol, это компонент avalondock, но на самом деле это одно и то же).
Конечно, вам нужно будет реализовать IDisposable для каждого класса, который имеет ссылки и т. Д., Но трудно придумать«чистый способ выключения» без осмысления этого интерфейса, верно?=)

Теперь о EventAggregator: у вас могут возникнуть проблемы, потому что нет связи: вы можете запустить слабое событие через него, но вы не можете ждать, пока объекты выполнят свою работу послечто.
И затем, вы не можете создать механизм для отмены выключения.

Если вы хотите, чтобы ваши различные представления могли отменить выключение, я предлагаю вам создать интерфейс с однимметод в нем:

public interface IShutdownAware
{
   bool CanShutdown();
}

Затем, перед вызовом dispose, вызовите CanShutdown();, если все они возвращают true, продолжите удаление, в противном случае отмените процесс завершения работы.

...