我正在寻找一个“最佳实践”(如果甚至是最好的),干净地关闭使用MEF和PRISM4的WPF应用程序。最终,我正在寻找某种“关闭服务”来管理从Shell到所有想要验证关闭应用程序的viewmodel(或其他订阅者)的事件/命令。事件聚合器是最干净的方式吗?其他意见/选择?
理想情况下,我的ToolbarRegion中的ToolbarView上有一个按钮(我的Shell中的2个区域中的1个)。这个按钮会在我的ToolbarViewModel上调用一个命令(在我的ToolbarControler上引用一个命令),这反过来会做两件事(我想?)......首先,通知所有订阅者它是关闭时间并允许其中任何一个取消关闭然后......如果没有取消,以某种方式通知shell关闭。我的应用程序的关闭模式设置为“ShutdownMode.OnMainWindowClose”,因此如果Shell关闭,我应该全部设置。
有人可以帮我解决这个问题吗?
答案 0 :(得分:3)
我正在开发一个使用相同内容的大型应用程序:MEF和PrismV4
我处理停机的方式有点不同:
在Shell中,有一个“工具”区域,在关闭事件中,在Shell中处理关闭
然后,对于在其他区域中注入的所有内容(tabcontrol),我将内容转换为IDisposable,并逐个关闭每个选项卡。 (实际上,它不是一个tabcontrol,它是一个avalondock组件,但它确实是一样的。)
当然,你必须在每个有引用等级的类上实现IDisposable,但很难想到一种“干净的关闭方式”,而不是说那个界面对吗? =)
现在,关于EventAggregator:你很可能遇到麻烦,因为没有耦合:你可以通过它发起一个弱事件,但你不能等到对象在那之后完成他们的工作。
然后,您无法建立取消关闭的机制。
如果您希望各种视图能够取消关闭,我建议您使用单个方法创建一个界面:
public interface IShutdownAware
{
bool CanShutdown();
}
然后在你调用dispose之前,如果它们都返回true,则调用CanShutdown();
,继续处理,否则,取消关闭过程。