5

我正在寻找一个“最佳实践”(如果有最好的)来干净地关闭使用 MEF 和 PRISM4 的 WPF 应用程序。最终,我正在寻找某种“关闭服务”来管理从 Shell 到想要验证关闭应用程序是否可以的任何视图模型(或其他订阅者)的所有事件/命令。事件聚合器是最干净的方式吗?其他意见/选择?

理想情况下,我的 ToolbarRegion 中的 ToolbarView 上有一个按钮(我的 Shell 中的 2 个区域中的 1 个)。此按钮将调用我的 ToolbarViewModel 上的命令(引用我的 ToolbarControler 上的命令),这反过来会做两件事(我认为?)...首先,通知所有订阅者它的关闭时间并允许他们中的任何一个取消关闭并且...其次,如果没有取消,则以某种方式通知外壳程序关闭。我的应用程序的关闭模式设置为“ShutdownMode.OnMainWindowClose”,因此如果 Shell 关闭,我应该已准备就绪。

有人可以帮我解决这个问题吗?

4

1 回答 1

3

我正在使用相同的东西开发一个大型应用程序:MEF 和 PrismV4

我对关闭它的处理方式有所不同:
在 Shell 中,有一个“工具”区域,关闭事件在 Shell 中处理关闭事件。
然后对于注入到另一个区域的所有东西,也就是一个tabcontrol,我将内容转换为IDisposable,并一个一个地关闭每个选项卡。(实际上,它不是 tabcontrol,它是一个 avalondock 组件,但实际上是一回事)。
当然,您必须在每个具有要处理的引用等的类上实现 IDisposable,但是如果不考虑该接口,很难想出一种“干净的关闭方式”,对吧?=)

现在,关于 EventAggregator:你很可能会遇到麻烦,因为没有耦合:你可以通过它触发一个弱事件,但你不能等待对象在此之后完成它们的工作。
然后,您无法制定取消关闭的机制。

如果您希望您的各种视图能够取消关闭,我建议您创建一个包含单个方法的接口:

public interface IShutdownAware
{
   bool CanShutdown();
}

然后在你调用 dispose 之前,CanShutdown();如果它们都返回 true,则调用,继续处理,否则,取消关闭过程。

于 2011-12-30T18:44:29.920 回答